上次記錄瞭如何在.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();
}
}
上述代碼提供了幾種獲取程序集的方法,可以選擇其中合適的方法使用