上次记录了如何在.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();
}
}
上述代码提供了几种获取程序集的方法,可以选择其中合适的方法使用