ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用
程序员文章站
2023-11-10 15:57:10
1.Autofac基础使用 参考: https://www.cnblogs.com/li150dan/p/10071079.html 2.ASP.NETCore 3.0 Autofac 容器替换 需要引用:Autofac, Autofac.Extensions.DependencyInjection ......
1.autofac基础使用
参考:
2.asp.netcore 3.0 autofac 容器替换
需要引用:autofac, autofac.extensions.dependencyinjection
在program.cs 使用autofacserviceproviderfactory进行容器替换。
public static ihostbuilder createhostbuilder(string[] args) => host.createdefaultbuilder(args) .configurewebhostdefaults(webbuilder => { webbuilder.usestartup<startup>(); }).useserviceproviderfactory(new autofacserviceproviderfactory());
3.asp.netcore 3.0 autofac 控制器属性注入
在startup 服务配置中加入控制器替换规则。
public void configureservices(iservicecollection services) { services.replace(servicedescriptor .transient<icontrolleractivator, servicebasedcontrolleractivator>()); services.addcontrollers(); }
建立一个module,实现属性注入,及自定义接口注册。
public class defaultmodule : autofac.module { protected override void load(containerbuilder containerbuilder) { //获取所有控制器类型并使用属性注入 var controllerbasetype = typeof(controllerbase); containerbuilder.registerassemblytypes(typeof(program).assembly) .where(t => controllerbasetype.isassignablefrom(t) && t != controllerbasetype) .propertiesautowired(); //containerbuilder.registertype<xiaomi>().as<iphone>().propertiesautowired(); } }
在startup中注册module即可使用控制器属性注入。
public void configurecontainer(containerbuilder builder) { builder.registermodule<defaultmodule>(); }
4.asp.netcore 3.0 autofac 全局容器获取
有时在系统初始化完成,接口和相应类注册完毕后想读取某个接口进行自定义初始化构建。比如初始化自定义工厂,加载外部dll,在不知外部类情况下进行初始化构建自己的服务。
代码比较简单,但是不知道的话比较伤脑筋。代码如下:
public void configure(iapplicationbuilder app, iwebhostenvironment env, ihost host) { using (var container = host.services.createscope()) { iphone phone= container.serviceprovider.getservice<iphone>(); } app.userouting(); app.useauthorization(); app.useendpoints(endpoints => { endpoints.mapcontrollers(); }); }