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

上述代码提供了几种获取程序集的方法,可以选择其中合适的方法使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值