C#控制台程序中使用官方依赖注入的实现
作者:Hello沃德哥 发布时间:2021-07-12 15:35:09
asp.net core 中已经自带了一个官方的依赖注入框架,现在想把它应用到控制台程序中,控制台程序是最简洁的代码结构,摒除了其他一堆嵌入的框架代码,只包含最简洁的入口函数,是学习基础类库框架的最佳选择,为什么最佳,原因很简单,没有其他项的干扰,Demo效果清晰明了,方便写测试代码,调试也顺畅。
1. 业务接口类设计编写
先要写一个测试用的接口和类,我写了一个很简单的计算求和的接口类和方法,方便待会注入演示效果。
我设计的演示接口很简单,IBaseService 基础接口负责生成一个随机的数字,这个数字在构造函数中生成,方便待会测试注入实例的生存周期,这样设计的目的是,每回实例化都要调用构造方法,而每次执行构造方法产生的随机数是不一样的,由此验证注入的生命周期,ICalculateService 接口则负责计算求和,就是将随机数重复相加n遍,屏幕打印结果。
/// <summary>
/// 基础服务接口,用来获取一个数字
/// </summary>
public interface IBaseService
{
/// <summary>
/// 数字属性
/// </summary>
int Number { get; }
/// <summary>
/// 获取数字方法
/// </summary>
/// <returns>随机数</returns>
int GetNumber();
}
/// <summary>
/// 计算服务接口,用来求和累加运算
/// </summary>
public interface ICalculateService
{
/// <summary>
/// 求和方法
/// </summary>
/// <param name="count"></param>
void Sum(int count);
}
/// <summary>
/// 计算服务
/// </summary>
public class CalculateService : ICalculateService
{
private readonly IBaseService _baseService;
public CalculateService(IBaseService baseService)
{
_baseService = baseService;
}
public void Sum(int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum+= _baseService.Number;
}
Console.WriteLine($"the result of ICalculateService is { sum }");
}
}
/// <summary>
/// 基础服务
/// </summary>
public class BaseService : IBaseService
{
public int Number { get; }
public BaseService()
{
Number = GetNumber();
Console.WriteLine($"the Number is {Number}");
}
public int GetNumber()
{
Random rand = new Random();
return rand.Next(1, 1000);
}
}
2. 依赖注入使用
注入操作也和在Asp.net core中雷同,先new一个ServiceCollection,然后添加注入的所需的接口或类及范围,
之所以要for循环3次,是为了验证生命周期,和方便观察调用构造函数的次数。IBaseService接口的注入实例生命周期设置为Transient,即每次调用都会实例化一次从而产生新的随机数,而ICalculateService则采用单例模式,所以它的构造方法只被调用了一次,在控制台运行时,会在屏幕上打印结果,清晰可辨。
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddTransient<IBaseService, BaseService>()
.AddScoped<ICalculateService, CalculateService>()
//.AddSingleton<ICalculateService, CalculateService>()
//.AddTransient<ICalculateService, CalculateService>()
.BuildServiceProvider();
for (int i = 0; i < 3; i++)
{
var calculateService = serviceProvider.GetService<ICalculateService>();
calculateService.Sum(10);
}
var baseService = serviceProvider.GetService<IBaseService>();
for (int i = 0; i < 3; i++)
{
int resultNum = baseService.GetNumber();
Console.WriteLine($"the result of IBaseService is {resultNum}");
}
Console.ReadKey();
}
3. 执行结果分析
我们可以看到ICalculateService接口的实例确实是单例,因为构造函数只被调用了一次,随机产生的数字也没变,接着我们会把ICalculateService的注入生命周期改成Transient 瞬态,看看会有什么变化。
很显然,它执行了五次构造方法,也就是实例化了五次,所以每回产生的随机数也不一样了。
来源:https://blog.csdn.net/DahlinSky/article/details/104737223


猜你喜欢
- springBoot Junit测试用例出现@Autowired不生效前提条件:1,测试类上面添加支持的注解就能取到spring中的容器的实
- 目录MultipartFile转FileFile转MultipartFile PS:file转base64字符串Multipart
- 一、简述1、AOP的概念如果你用java做过后台开发,那么你一定知道AOP这个概念。如果不知道也无妨,套用百度百科的介绍,也能让你明白这玩意
- 先来看看效果图跳动的小球做这个动画,需掌握: 1、属性动画  
- 本文实例为大家分享了android拖拽框,裁剪出图片的具体代码,供大家参考,具体内容如下import android.graphics.Bi
- 这里来讲一下后台java如何构造多叉树,这样前台就可接收到数据递归构造树形菜单了。我们来理一下如何实现构造多叉树的逻辑吧,其实整个问题概括起
- 前提:当我们使用Winform开发的时候,经常会遇到:System.InvalidOperationException:&ldquo
- 本文实例讲述了java 线程方法join简单用法。分享给大家供大家参考,具体如下:虽然关于讨论线程join方法的博客已经很多了,不过个人感觉
- 在AndroidMenifest.xml中,常常会有下面的语句: <uses-sdk android:minSdkVersion=&q
- 1.方法重写子类写和父类一样的方法定义public void call(){System.out.println(“输出文字”); //父类
- 举个例子Map < String , Object > jsonMap = new HashMap< String , O
- 实例如下:/// <summary> /// 上传ftp服务 /// </summary>
- 本文实例讲述了C#检测上传文件真正类型的方法。分享给大家供大家参考。具体分析如下:对于用户上传的文件如果只是根据扩展名判断,很容易上传上来可
- using System;using System.Collections.Generic;using System.Linq;using
- 本文实例讲述了C#实现对二维数组排序的方法。分享给大家供大家参考。具体实现方法如下:/// <summary>/// A gen
- 时间格式化在项目中使用频率是非常高的,当我们的 API 接口返回结果,需要对其中某一个 date 字段属性进行特殊的格式化处理,通常会用到
- 目录一对一关联保存:留言表实体类配置:(主表)留言内容表配置:(从表)留言表hbm.xml配置:(主表)留言内容表hbm.xml配置:(从表
- C# 利用代理爬虫网页实现代码:// yanggang@mimvp.com// http://proxy.mimvp.com// 2015-
- hive的表数据是可以同步到impala中去的。一般impala是提供实时查询操作的,像比较耗时的入库操作我们可以使用hive,然后再将数据
- 首先看一看什么是装箱和拆箱?简单的来说:装箱就是值类型转换为引用类型;拆箱就是引用类型转换为值类型。值类型,包括原类型(Sbyte、Byte