.net7+ autofac的依赖注入
版本: .Net 7.0
从.net6.0以后 Program和Startup合并成了Program一个文件,因此曾经autofac在Startup里面的ConfigureContainer方法就消失了.虽然在官方文档中还可以找到Startup的ConfigureContainer使用方法,不过既然微软推荐使用单体Program文件,那就遵守一下.
在Program插入以下代码
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); //告诉系统使用autofac builder.Host.ConfigureContainer<ContainerBuilder>(cb => {
cb.RegisterInstance(new B()); //实例注册 等于单例 cb.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope(); //接口注册 cb.RegisterGeneric(typeof(BaseRe<>)).As(typeof(IBaseRe<>)).InstancePerLifetimeScope(); //泛型注册
cb.RegisterType<Data>().As<IData>().PropertiesAutowired(); //属性注入 注意asp.net core使用autofac的属性注入还需要注入控制器
cb.RegisterAssemblyTypes(Assembly.Load("Domain")) //程序集注入
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
});
1.生命周期
注入的生命周期大体有3种:瞬时,域,单例 .(autofac的生命周期还会在这3个中在细分,这里不详细说明了)
.InstancePerLifetimeScope();
这段代码就是设置注入的生命周期具体类型.(默认是瞬时)
2.细节杂谈
2.1 多实现
cb.RegisterType<DB.EF.Repository.UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
cb.RegisterType<DB.Dapper.Repository.UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
2.1.1 覆盖
这个时候如果没有特殊操作的话,获取的是最后一个注入的实体类.
public UserService(IUserRepository userRepository) { this.userRepository = userRepository; }
2.1.2 数组获取
如果改成这种方式,那么2个实体类都可以拿到
public UserService(IEnumerable<IUserRepository> userRepositorys) { //判断需要哪个具体类在操作 }
2.1.3 具体类获取
cb.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource(x => x.IsAssignableTo<IUserRepository>()));
在注册的代码段写上上面的代码,然后在构造函数就可以直接写具体的类然后注入,不过这样可能会造成依赖,不是很推荐
public UserService(DB.EF.Repository.UserRepository userRepository, DB.Dapper.Repository.UserRepository userRepository1) { }
2.2 构造函数注入
走构造函数注入.构造函数不能有相同参数数量,并且默认是走最多参数数量的构造函数.
浙公网安备 33010602011771号