当前位置:网站首页>Autofac注册组件(3)

Autofac注册组件(3)

2022-07-18 04:29:00 有诗亦有远方

官网地址

点击这里

一、扫描类型

在其他方面,被称为约定驱动的注册或扫描,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工厂

Program.cs中添加:.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分别是代表三个生命周期的接口

原网站

版权声明
本文为[有诗亦有远方]所创,转载请带上原文链接,感谢
https://blog.csdn.net/wsnbbdbbdbbdbb/article/details/125815284