Autofac.Extensions
安装方式
二、扩展注册
var builder = WebApplication.CreateBuilder(args);
// 替换系统自带的DI容器为Autofac
// 注意 6.0.7 版本之后 这个位置没有Host了,因为需要支持自带的 IServiceCollection 的扩展服务注册
// 6.0.8 支持自带的 ConfigureHostBuilder 的扩展服务注册
builder.UseAutofacExtensions(builder =>
{
// 多实现类服务获取服务 默认:false
// 启用后才能通过扩展的 IAutofacMultipleService 服务多实现类接口
// 没有设置的话,默认不注册该服务
builder.EnabledLycorisMultipleService = true;
});
// Add services to the container.
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseAuthorization();
app.MapControllers();
app.Run();
三、服务注册
3.1 服务注册
服务注册使用特性的方式处理,在需要注册的服务类上引用特性[AutofacRegister(ServiceLifeTime.Scoped)]
AutofacRegisterAttribute
特性属性详解
ServiceLifeTime
:服务生命周期,同系统的一样有:Transient
,Scoped
,Singleton
三种PropertiesAutowired
:属性注入,Autofac特有的注入方式,默认为falseEnableInterceptor
:开启AOP拦截支持,默认为false,只有开启了注册服务时候才会同时注入拦截器Self
:仅注册当前类不与接口绑定,适合模型类、Quartz的调度任务注册Interface
:指定接口,当前类继承了多个接口时,可以通过设置此属性指定注册的接口Interceptor
:添加指定AOP拦截器,适合当前类库仅个别服务使用到某些固定的一个拦截器使用,该属性设置后,会默认开启AOP拦截支持,同样的指定的AOP拦截器也需要实现Castle.Core
的IInterceptor
接口IsInterceptor
:当前服务是否为AOP服务
3.2 注册举例
基础注册
// 瞬态服务注册
[AutofacRegister(ServiceLifeTime.Transient)]
public class BlogAppService : IBlogAppService
{
}
// 作用域服务注册
[AutofacRegister(ServiceLifeTime.Scoped)]
public class BlogAppService : IBlogAppService
{
}
// 单例服务注册
[AutofacRegister(ServiceLifeTime.Singleton)]
public class BlogAppService : IBlogAppService
{
}
继承了多个接口的的实现,想指定注册接口
[AutofacRegister(ServiceLifeTime.Scoped, PropertiesAutowired = true, Interface = typeof(IBlogAppService))]
public class BlogAppService : ApplicationBaseService<BlogAppService>, IBlogAppService, IBlogBaseAppService
{
}
一个接口多个实现类
// IBlogAppService 接口第一个实现类,利用 MultipleNamed 属性,进行区分指定
[AutofacRegister(ServiceLifeTime.Scoped, MultipleNamed = "Blog.A")]
public class BlogAAppService : ApplicationBaseService<BlogAppService>, IBlogAppService
{
}
// IBlogAppService 接口第二个实现类,利用 MultipleNamed 属性,进行区分指定
[AutofacRegister(ServiceLifeTime.Scoped, MultipleNamed = "Blog.B")]
public class BlogBAppService : ApplicationBaseService<BlogAppService>, IBlogAppService
{
}
使用扩展内服务 IAutofacMultipleService
进行指定的实现类获取 注意:6.0.8
版本及以后需要在添加扩展的时候,配置EnabledLycorisMultipleService
属性为true
,才能正常使用该服务,否则扩展不会注册 IAutofacMultipleService
服务
public class Service : IService
{
private readonly IBlogAppService _blogA;
private readonly IBlogAppService _blogB;
public Service(IAutofacMultipleService multipleService)
{
// 使用 GetService 获取服务时,如果服务找不到或者服务未注册会抛出 ArgumentNullException 异常
_blogA = multipleService.GetService<IBlogAppService>("Blog.A");
// 使用 TryGetService 获取服务时,如果服务找不到或者未注册会返回null
_blogB = multipleService.TryGetService<IBlogAppService>("Blog.B");
}
}
需要使用属性注入的服务注册
[AutofacRegister(ServiceLifeTime.Scoped, PropertiesAutowired = true)]
public class BlogAppService : ApplicationBaseService<BlogAppService>, IBlogAppService
需要开启AOP拦截的服务注册
[AutofacRegister(ServiceLifeTime.Scoped, PropertiesAutowired = true, EnableInterceptor = true)]
public class BlogAppService : ApplicationBaseService<BlogAppService>, IBlogAppService
Castle.Core
AOP拦截器注册
[AutofacRegister(ServiceLifeTime.Scoped, IsInterceptor = true)]
public class UnitOfWorkInterceptor : IInterceptor
{
}
[AutofacRegister(ServiceLifeTime.Scoped, IsInterceptor = true)]
public class UnitOfWorkAsyncInterceptor : IAsyncInterceptor
{
}
当前服务指定额外添加的AOP拦截服务注册
[AutofacRegister(ServiceLifeTime.Scoped, Interceptor = typeof(UnitOfWorkInterceptor))]
public class BlogAppService : IBlogAppService
{
}
四、模块注册
4.1 基类扩展
在需要使用到注册服务的类库创建一个类并继承扩展好的基类LycorisRegisterModule
public class ApplicationModule : LycorisRegisterModule
{
// 注册扩展服务,如一些Nuget包中的服务需要使用 builder.Host 扩展注册
// 注意:需要手动重写
public override void HostRegister(ConfigureHostBuilder host)
{
host.UseSerilog();
}
// 注册扩展服务,如一些Nuget包中的服务需要使用 IServiceCollection 扩展注册
// 注意:需要手动重写
public override void SerivceRegister(IServiceCollection services)
{
services.AddScoped<ISerService, SerService>();
}
// 注意:由于有些使用的小伙伴提示,使用特性自动注册后,这部分基本都用不到,但是由于 abstract 修饰,所以每次都需要重写
// 注意:需要手动重写
public override void ModuleRegister(LycorisModuleBuilder builder)
{
// 如果你不习惯使用特性自动注册,也可以在此处自己注册
// 此处仅是使用示例,请不要照搬代码,也不要纠结我这里注册了多次
// 注册需要注意不要在此处注册的服务也使用特性自动注册,这样会引发注册异常
// 此处仅展示几种,实际上里面包含了所有的生命周期的方法
builder.RegisterScoped<ApplicationAppService>();
builder.RegisterScoped<IApplicationAppService, ApplicationAppService>();
builder.RegisterScoped<SalesUserAppService>(opt =>
{
// 开启Autofac属性注入
opt.PropertiesAutowired = true;
// 开启AOP拦截
opt.EnableInterceptor = true;
// 设置AOP拦截器(可以添加多个,添加多个的时候为避免拦截顺序打不到你的预期,请指定拦截器顺序,同上面一直数值越小,优先级越大,但是数值必须大于0)
// 如果不设置顺序,那顺序编排就会按照添加的顺序
// 如果添加了拦截器,会自动开启AOP拦截,即使你手动关闭也无效,所以如果当前服务不想开启AOP拦截,就不要添加拦截器
opt.InterceptedBy<UnitOfWorkInterceptor>(0);
});
// 注册处拦截器
builder.RegisterInterceptor<OperationLogInterceptor>();
// 注册异步拦截器
builder.RegisterAsyncInterceptor<OperationLogAsyncInterceptor>();
/*
* 服务使用AOP拦截器注意事项:
* 1. Aop拦截器需要实现 Castle.Core 的 IInterceptor 接口
* 2. 添加AOP拦截器,如果有多个拦截器请注明拦截器拦截顺序,数值越小优先级越大,默认为0,数值必须大于等于0
* 3. 需要使用拦截器的服务请在特性中开启允许AOP拦截,否则即使你添加了拦截器,也无法使用
* 4. 如果不设置顺序,那顺序编排就会按照添加的顺序
* 5. 此处添加的拦截器会应用于当前类库下所有开启AOP拦截的服务
* 6. 为了规范使用,此处添加的拦截器并不会自己注册,需要使用者使用自动特性注册或者在此处手动注册
*/
// EFCore数据库事务AOP拦截器
// 手动注册处拦截器(使用自动特性注册的话,就不需要此处再添加了)
builder.RegisterInterceptor<UnitOfWorkInterceptor>();
// 手动注册处拦截器(使用自动特性注册的话,就不需要此处再添加了)
builder.RegisterAsyncInterceptor<UnitOfWorkAsyncInterceptor>();
// 为当前类库添加拦截器
builder.InterceptedBy<UnitOfWorkInterceptor>(0);
// 例子:操作日志AOP拦截器
// 手动注册处拦截器(使用自动特性注册的话,就不需要此处再添加了)
builder.RegisterInterceptor<OperationLogInterceptor>();
// 手动注册处拦截器(使用自动特性注册的话,就不需要此处再添加了)
builder.RegisterAsyncInterceptor<OperationLogAsyncInterceptor>();
// 为当前类库添加拦截器
builder.InterceptedBy<OperationLogInterceptor>(1);
}
}
4.2 原生Autofac
public class ApplicationAutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// do something
}
}
4.3 引入模块注册服务
var builder = WebApplication.CreateBuilder(args);
// 替换系统自带的DI容器为Autofac
// 注意 6.0.6 版本之后 这个位置没有Host了,因为需要支持自带的IServiceCollection的扩展服务注册
builder.UseAutofacExtensions(builder =>
{
// 如果有多个类库的服务,每个类库都需要新建一个类来扩展封装好的 AutofacRegisterModule 并在此处依次添加即可
// 添加方式1:
builder.AddLycorisRegisterModule<ApplicationModule>();
builder.AddLycorisRegisterModule<ModelModule>();
// 添加方式2:
builder.AddLycorisRegisterModule<ApplicationModule>()
.AddLycorisRegisterModule<ModelModule>();
// Autofac原生的模块注册
// 注意使用原生的模块注册,扩展内除 IAutofacMultipleService 服务,其他功能均不支持
// 原生注册的功能,仅仅是给部分想试水扩展的朋友一个兼容性而已,不需要全部的注册都改造,只需要改造其中一个的部分,其他依旧参照原生的进行测试来决定需不需要使用
builder.AddAutofacModule<ApplicationAutofacModule>();
// 如果大部分类库都用到某些固定的拦截器,这里可以使用注入全局拦截器。
// 需要使用拦截器的服务请在特性中开启允许AOP拦截
// 注意全局拦截器仅对继承 LycorisRegisterModule 的模块有效
builder.AddGlobalInterceptor<UnitOfWorkInterceptor>(0);
});
- 感谢你赐予我前进的力量
本网站的原创文章部分资源内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系博主邮箱:zzyo.yj@outlook.com 进行删除处理
本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向博主举报
声明:版权所有,违者必究 | 如未注明,均为原创 | 本网站采用CC BY-NC-SA 4.0 协议进行授权
转载:转载请注明原文链接 - Lycoris