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文档链接
- 官方英文文档链接 https://autofaccn.readthedocs.io/en/latest/
- Autofac 4.0 中文文档 https://autofaccn.readthedocs.io/zh/latest/