我在 api .net 6 中使用 mediatr nuget 包和 autofac。
我只想装饰中介者的 IRequestHandler
例如,我有 IRequestHandler
class AmountCalculationDecorator: IRequestHandler<UpdateWallet, AmountCalculation>
{
private readonly IRequestHandler<UpdateWallet, AmountCalculation> _decorated;
public AmountCalculationDecorator(
IRequestHandler<UpdateWallet, AmountCalculation> decorated)
{
_decorated = decorated;
}
public async Task<AmountCalculation> Handle(UpdateWallet request, CancellationToken cancellationToken)
{
// mpla mpla
}
}
现在我尝试在 autofac di 中注册这个装饰器。
public partial class ApplicationModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
var thisAssembly = Assembly.GetExecutingAssembly();
builder
.RegisterMediatR(thisAssembly);
builder
.RegisterDecorator<AmountCalculationDecorator, IRequestHandler<UpdateWallet, AmountCalculation>>();
}
}
但我明白了
检测到循环组件依赖性:AmountCalculationDecorator。
如何实现这个实现?
问题如下:
.RegisterMediatR(thisAssembly)
自动注册IRequestHandler
的所有实现,包括AmountCalculationDecorator
。然后你将 AmountCalculationDecorator
注册为 IRequestHandler<UpdateWallet, AmountCalculation>
的装饰器,因此它本身就是一个装饰器......因此存在循环依赖。
您可以在
此处查看
RegisterMediatR
方法代码。
我能看到的最简单的解决方案是不向 RegisterMediatR 提供程序集,而是自己注册处理程序,然后您可以完全控制要注册的实现(例如通过命名空间或公开)。或者你可以完全删除这个nuget包并自己注册MediatR
另一种选择: 您可能还想使用管道行为而不是装饰器。这是 MediatR 内置的 decorate 处理程序调用方法