第一次使用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 下了。这里是看的老张的博客学的。
如此这样就结束了!