.Net Core IOC依賴注入和Autofac(二)

上次記錄瞭如何在.Net Core下實現IOC,和使用第三方的Autofac來替換自帶的IOC框架。

繼續來聊下Autofac註冊程序集的方法,上次就對單個接口實現了註冊,這次要講如何對程序集進行註冊

Autofac註冊之前已經講了在Startup文件中對ConfigureServices方法改造返回IServiceProvider ,具體如IServiceProvider ConfigureServices(IServiceCollection services) 

            //實例化Autofac容器
            ContainerBuilder builder = new ContainerBuilder();
            //將collection中的服務填充到Autofac
            builder.Populate(services);
            //註冊 上次在此註冊
            //builder.RegisterType<ServiceA>().As<IServiceA>().InstancePerLifetimeScope();

            //註冊InstanceModule組件  使用組件單獨註冊 這次我們使用單獨的AutofacConfig來進行註冊,不放在Startup中,便於後期維護
            builder.RegisterModule<AutofacConfig>();


            //創建容器
            IContainer container = builder.Build();
            //第三方IOC容器來實現  兩種方法都可以返回IServiceProvider
            return new AutofacServiceProvider(container);
            //return container.Resolve<IServiceProvider>();

AutofacConfig的實現代碼 需繼承Autofac.Module 然後重寫Load(ContainerBuilder builder)方法

    public class AutofacConfig:Autofac.Module
    {
        //重寫Autofac管道中的Load方法,在這裏注入註冊的內容
        protected override void Load(ContainerBuilder builder) {
            //base.Load(builder);
            //重寫Autofac管道中的Load方法,在這裏注入註冊的內容
            //builder.RegisterType<ServiceA>().As<IServiceA>().InstancePerLifetimeScope();

            //以程序集形式註冊
            //獲取以My開頭的dll程序集的集合利用Directory.GetFiles獲取dll,利用Assembly.LoadFrom委託select來對剛纔的每個dll文件進行獲取集合
            Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "My*.dll").Select(Assembly.LoadFrom).ToArray();
            //註冊所有實現了 IDependency 接口的類型
            Type baseType = typeof(IDependency);
            //獲取程序集
            //方法一
            //var asm = Assembly.Load("MyMvcCore");
            //方法二
            //var asm = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName("MyMvcCore"));
            builder.RegisterAssemblyTypes(assemblies)
                .Where(b => !b.IsAbstract && baseType.IsAssignableFrom(b))//IsAssignableFrom是否實現了基類的接口這裏指的是IDependency
                .AsSelf().AsImplementedInterfaces().PropertiesAutowired().InstancePerLifetimeScope();
        }
    }

上述代碼提供了幾種獲取程序集的方法,可以選擇其中合適的方法使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章