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分别是代表三个生命周期的接口

posted @   有诗亦有远方  阅读(39)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示