Autofac注册组件(3)

官网地址

点击这里

一、扫描类型

在其他方面,被称为约定驱动的注册或扫描,Autofac可以根据用户指定的规则从一个程序集中注册一组类型:

 builder.RegisterAssemblyTypes(typeof(BaseRepository<>).Assembly)

RegisterAssemblyTypes()
调用将适用一组规则,如果有多种不同的组件注册,一次或多次调用

1.过滤类型(Filtering Types)

RegisterAssemblyTypes()接受一个或多个程序集的参数数组。默认情况下,程序集中的所有的公共的,具体类将被注册。你可以过滤一组注册的类型,通过使用linq表达式。

过滤注册类型,使用Where()语法过滤:

  builder.RegisterAssemblyTypes(typeof(IService).Assembly)
            //IsAssignableFrom 判断IService类型是否与X类型一样
                .Where(x => typeof(IService).IsAssignableFrom(x))
                //  是以接口方式进行注入,注入这些类的所有的公共接口作为服务(除了释放资源)
                .AsImplementedInterfaces().InstancePerLifetimeScope();

2.指定服务(Specifying Services)

对于RegisterAssemblyTypes()注册语法是单个类型注册语法的超级集合,所以像As()方法都将在程序集中很好的工作

 builder.Register().As<>().InstancePerLifetimeScope();

正如通常的组件注册,可以一起添加多个As()调用。
还添加了一些额外的注册方法,使其更容易建立共同的约定:

方法描述示例
AsImplementedInterfaces()注册类型提供所有其公共接口作为服务(不包括IDisposable接口)。builder.RegisterAssemblyTypes(asm).Where(t => t.Name.EndsWith(“Repository”)).AsImplementedInterfaces();
AsClosedTypesOf(open)可分配给注册类型一个接近开放泛型类型的实例。builder.RegisterAssemblyTypes(asm).AsClosedTypesOf(typeof(IRepository<>));
AsSelf()默认: 注册类型本身 - 当重写其他服务默认规范时非常有用。builder.RegisterAssemblyTypes(asm) .AsImplementedInterfaces().AsSelf();

二、net core 3.x使用Autofac以及使用Autofac进行自动注入

一、需要引入的库:

Autofac

Autofac.Extensions.DependencyInjection

二、使用Autofac工厂

3.0版本

Program.cs中添加:.UseServiceProviderFactory(new AutofacServiceProviderFactory())

6.0

Program.cs添加builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
            .UseServiceProviderFactory(new AutofacServiceProviderFactory());

三、StarpUp.cs中添加方法

 public virtual void ConfigureContainer(ContainerBuilder builder)
        {
            builder.RegisterModule(new ApplicationModule(Configuration[ApiDefaults.ConnectionString]));
            builder.RegisterModule(new MediatorModule());
        }

四、设置注册类型模块

/// 自动注入通过继承Module
public class ApplicationModule : Module
    {
    //重写load方法用于加载配置
     protected override void Load(ContainerBuilder moduleBuilder)
        {
            var assemblys = AppDomain.CurrentDomain.GetAssemblies().ToArray();
            var perRequestType = typeof(IScoped);
            moduleBuilder.RegisterAssemblyTypes(assemblys)
                .Where(t => perRequestType.IsAssignableFrom(t) && t != perRequestType)
                .PropertiesAutowired()
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

            var perDependencyType = typeof(ITransient);
            moduleBuilder.RegisterAssemblyTypes(assemblys)
                .Where(t => perDependencyType.IsAssignableFrom(t) && t != perDependencyType)
                .PropertiesAutowired()
                .AsImplementedInterfaces()
                .InstancePerDependency();

            var singleInstanceType = typeof(ISingleton);
            moduleBuilder.RegisterAssemblyTypes(assemblys)
                .Where(t => singleInstanceType.IsAssignableFrom(t) && t != singleInstanceType)
                .PropertiesAutowired()
                .AsImplementedInterfaces()
                .SingleInstance();
        }
    }

以上 ITransient、ISingleton、IScoped分别是代表三个生命周期的接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值