.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 构造函数注入

走构造函数注入.构造函数不能有相同参数数量,并且默认是走最多参数数量的构造函数.

 

posted @ 2023-11-08 20:05  大大只植物  阅读(177)  评论(0)    收藏  举报