介绍
Autofac 是一个适用于 .NET 的强大的 IoC(控制反转)容器。它管理类之间的依赖关系,使得随着应用程序规模和复杂性的增长,应用程序仍然易于修改。它允许您管理 .NET 应用程序中的组件依赖关系,并自动将依赖项解析到它们所需的对象中。Autofac 提供了一个灵活的、功能丰富的 API,使您可以轻松地配置和使用依赖注入。
安装
在Nuget中安装Autofac包
使用
基本流程
使用Autofac的Ioc容器基本流程:
- 创建容器创建器
- 往容器中注册对应的类型和对象
- 创建容器
- 使用容器
//容器创建器
ContainerBuilder builder = new ContainerBuilder();
//注册类型
builder.RegisterType<MyService>();
//创建容器
var container=builder.Build();
//使用容器,获取实例
var service = container.Resolve<MyService>();
不同类型注册方式
类型注册
使用RegisterType
注册
builder.RegisterType<MyService>();
接口和实现类对应的注册
使用RegisterType
和As
注册
使用的使用直接获取IMyService,自动创建MyService对象
builder.RegisterType<MyService>().As<IMyService>();
泛型注册
使用RegisterGeneric
进行注册
builder.RegisterGeneric(typeof(Repository<>));
不同生命周期的注册
瞬态
直接注册都是瞬态的,每次使用都new一个新的对象
单例
只会在第一次使用时生成一个单例对象
builder.RegisterType<MyService>().SingleInstance();
使用
直接使用
使用Resolve
方法直接获取对象
var test = container.Resolve<Test>();
构造方法注入
使用容器创建对象时,会自动生成构造方法需要的对象,并传入参数
前提是参数也在容器中注册过
public class Test
{
private IMyService _myService;
private string _name;
public Test(IMyService service)
{
_myService=service;
}
}
//使用
// 使用容器创建Test时,会自动生成IMyService对象,并传入参数
var test = container.Resolve<Test>();
带参数传入
在使用容器创建时,需要自动注入一些服务的同时,还需要自己传入参数的参数的情况如下使用
var test2 = container.Resolve<Test>(new NamedParameter("name","abc"));
使用NamedParameter
类型进行参数,第一个是参数名称,第二个是参数的值
示例:
public class Test
{
private IMyService _myService;
private string _name;
public Test(string name,IMyService service)
{
_name = name;
_myService = service;
}
}
//使用
var test2 = container.Resolve<Test>(new NamedParameter("name","abc"));