Autofac依赖注入框架使用入门

Autofac依赖注入使用

Autofac是一套高效易用的依赖注入框架。官方网站:http://autofac.org/,Github上的项目链接:https://github.com/autofac/Autofac,可以通过Nuget安装获取,十分便捷,引用官网上的介绍则是:

Autofac is an addictive Inversion of Control container for .NET Core, ASP.NET Core, .NET 4.5.1+, Universal Windows apps, and more.

支持 .NET Core, ASP.NET Core, .NET 4.5.1+, Universal Windows apps, and more.,但是不知道这个and more都包括哪些…(手动滑稽)

1. Autofac的基本用法

首先要先编写一个测试用的业务接口和类,这里用到的接口和类是我在上一篇博客中写的,可以参考我的这个链接 《C#控制台程序中使用官方依赖注入》,里面的业务接口和类我在这里再大概的描述一下,“IBaseService 基础接口负责生成一个随机的数字,这个数字在构造函数中生成,方便待会测试注入实例的生存周期,这样设计的目的是,每回实例化都要调用构造方法,而每次执行构造方法产生的随机数是不一样的,由此验证注入的生命周期,ICalculateService 接口则负责计算求和,就是将随机数重复相加n遍,屏幕打印结果。”
有了业务接口和类,我们接下来就可以进行注入操作了

static void Main(string[] args)
{
	ContainerBuilder builder = new ContainerBuilder();
	builder.RegisterType<BaseService>().As<IBaseService>();
	builder.RegisterType<CalculateService>().As<ICalculateService>();
	IContainer container = builder.Build();
	var baseService = container.Resolve<IBaseService>();
	for (int i = 0; i < 5; i++)
	{
		int resultNum = baseService.GetNumber();
		Console.WriteLine($"{DateTime.Now} the result of IBaseService is {resultNum}");
	}
	for (int i = 0; i < 5; i++)
	{
		var calculateService = container.Resolve<ICalculateService>();
		calculateService.Sum(10);
	}
	Console.Read();
}

执行结果,从执行结果我们可以看出,Autofac注册实例默认都是每次请求返回新的实例。
执行结果截图

2. Autofac常用方法
  • builder.RegisterType<Object>().As<IObject>():注册类型及其实例
  • IContainer.Resolve<IObject>():解析某个接口的实例
  • builder.RegisterType<Object>().Named<IObject>(string name):为一个接口注册不同的实例。即在注册时起名字
  • IContainer.ResolveNamed<IDAL>(string name):解析某个接口的命名实例
  • builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以枚举的方式为一个接口注册不同的实例
  • IContainer.ResolveKeyed<Iobject>(Enum enum):根据枚举值解析某个接口的特定实例
  • IContainer.Resolve<T>(NamedParameter namedParameter):在解析实例T时给其赋值
  • builder.RegisterAssemblyTypes(Assembly assembly):注册程序集下所有类型
3. Autofac生命周期

当请求服务时,Autofac可以返回单个实例,即单实例作用域,新实例,即每个依赖作用域或某种上下文中的单个实例。

  • InstancePerDependency
    对每一个依赖或每一次调用创建一个新的唯一的实例,即每次都会返回一个新的实例,并且这是默认的生命周期。
  • Single Instance
    单例,所有服务请求都将会返回同一个实例。每一次依赖组件或调用Resolve()方法都会得到一个相同的共享的实例。其实就是单例模式。
  • Instance Per Lifetime Scope,在一个嵌套语句块中,只会返回一个实例。在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。
  • Instance Per Matching Lifetime Scope
    在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。标识了的生命周期域中的子标识域中可以共享父级域中的实例。若在整个继承层次中没有找到标识的生命周期域,则会抛出异常
  • Instance Per Request
    某些应用程序类型自然适用于“请求”类型语义,例如ASP.NET Web Forms和MVC应用程序。 在这些应用程序类型中,有能力为每个请求提供一种“单例”。
  • Instance Per Owned
    在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常

以单例来举例

builder.RegisterType<CalculateService>().As<ICalculateService>().SingleInstance();

执行结果与非单例对比,左边的截图是单例,右边的截图是非单例
单例截图对比

4. Autofac文档链接
5. 参考博客链接

Autofac使用
Autofac容器对象实例的几种生命周期类型
Autofac框架详解
AutoFac入门

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值