NET6使用AutoFac依赖注入(仓储模式)

发布时间 2023-07-13 19:38:03作者: 尝尝手指

第一次使用autofac,然后net6最新长期支持的,就想着在net6的基础上使用autofac,我对依赖注入理解很差,一知半解的搞了好久。好在有了一点点的头绪,记录下省的以后忘记(突然发现自己以前用过的东西忘了好多……)

  1. 首先你要有个仓储模式的项目、这个自己搭建吧
  2. 在Program.cs文件中:配置程序依赖注入容器工厂为AutoFac,覆盖默认的容器工厂。
  3. 添加AutoFacMoudleReg模块,注意:这个名字是你自己起的类名,我们的注册规则写在这个类里面 
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());//覆盖默认的容器工厂。
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
    builder.RegisterModule(new AutoFacMoudleReg());//添加注册规则模块儿
});

 

  • 4. AutoFacMoudleReg模块编写。
  •   4.1 首先继承autofac的Module
  •   4.2 其次重写Load方法
  •   4.3  RegisterAssemblyTypes:注册程序集中所有的类型

    AsImplementedInterfaces:把服务里继承的接口也注册(应该是这个意思,这块儿不是很了解,大概是这个意思)

    PropertiesAutowired:自动属性注入(没有深究,GPT:当一个类中有公共的可写属性时,Autofac 将会自动为这些属性注入相应的依赖项)

    InstancePerDependency:生命周期,瞬时的(有没有其他的生命周期,我还没了解)

        protected override void Load(ContainerBuilder builder)
        {
            string basePath=AppDomain.CurrentDomain.BaseDirectory;//获取程序集路径

            //你要注册的服务 Dll路径
            var assemblysRepositoryPath = Path.Combine(basePath, "DogRepository");
            var assemblysServicesPath = Path.Combine(basePath, "DogService");

              
            //注入仓储
            var assemblysRepository = Assembly.LoadFrom(assemblysRepositoryPath);
            builder.RegisterAssemblyTypes(assemblysRepository)
                      .AsImplementedInterfaces()
                      .PropertiesAutowired()
                      .InstancePerDependency();

            //注入服务
            var assemblysServices = Assembly.LoadFrom(assemblysServicesPath);
            builder.RegisterAssemblyTypes(assemblysServices)
                      .AsImplementedInterfaces()
                      .InstancePerDependency()
                      .PropertiesAutowired();
        }

5.最重要的一点!!!因为仓储模式是互相调用的接口,理论上在程序(API/Controllers)层是没办法注入仓储层和服务层的服务的。除非你引用他们,但是如此这样,仓储模式的理念:解耦!就有点违背了。看老张的文章,依赖注入并非为了解耦,emmmm。其实我不是很了解,直接说结论。就是设置仓储和服务生成的相对路径,将 Repository 层和 Service 层项目生成地址改成相对路径,编译的时候就直接生成到了 api 层 bin 下了。这里是看的老张的博客学的。

 

 如此这样就结束了!