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