欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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();
            });
        }