Autofac注册组件(3)
Autofac注册组件
官网地址
一、扫描类型
在其他方面,被称为约定驱动的注册或扫描,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分别是代表三个生命周期的接口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现