是否有可能使用Autofac和MediatR使用装饰类来为每个事件处理程序创建LifeTimeScope
问题描述:
是否可以使用装饰类来为每个具有Autofac和MediatR的事件处理程序创建LifeTimeScope?是否有可能使用Autofac和MediatR使用装饰类来为每个事件处理程序创建LifeTimeScope
所以我们有两个Eventhandlers监听同一个事件。 装饰者应该创建一个LifteTimeScope,解析装饰的事件处理器并调用装饰的事件处理器的Handle方法。 我发现很多使用CommandHandlers的例子。 我玩过类似于下面显示的代码。 但我不能让它工作。有些帖子还建议制作一个autofac注册源。 IHAVE放在这里提琴https://dotnetfiddle.net/fw4IBw
class EventHandlerA : IAsyncNotificationHandler<AnEvent>
{
public void Handle(AnEvent theEvent)
{
}
}
class EventHandlerB : IAsyncNotificationHandler<AnEvent>
{
public void Handle(AnEvent theEvent)
{
}
}
/// <summary>
/// Wraps inner Notification Handler in Autofac Lifetime scope named
PerEventHandlerScope"
/// </summary>
/// <typeparam name="TNotification"></typeparam>
public class LifetimeScopeEventHandlerDecorator<TNotification> :
IAsyncNotificationHandler<TNotification> where TNotification : class,
IAsyncNotification
{
private readonly ILifetimeScope _scope;
private readonly Type _decoratedType;
/// <summary>
/// Const Name of Scope that dependencies can Match using
PerMatchingLifeTimeScope(LifetimeScopeEventHandlerDecorator.ScopeName)
/// </summary>
public const string ScopeName = LifeTimeScopeKeys.PerHandlerKey;
/// <summary>
/// constructor
/// </summary>
/// <param name="scope"></param>
public LifetimeScopeEventHandlerDecorator(ILifetimeScope scope, Type
decoratedType)
{
_decoratedType = decoratedType;
_scope = scope;
}
/// <summary>
/// Wraps inner Notification Handler in Autofac Lifetime scope
/// </summary>
/// <param name="notification"></param>
/// <returns></returns>
public async Task Handle(TNotification notification)
{
using (var perHandlerScope = _scope.BeginLifetimeScope(
LifeTimeScopeKeys.PerHandlerKey))
{
var decoratedHandler =
perHandlerScope.ResolveKeyed<IAsyncNotificationHandler<TNotification>>(
"IAsyncNotificationHandlerKey");
await decoratedHandler.Handle(notification);
}
}
}
答
是其可能的。
最后我想出了一个解决方案。该代码可以蜜蜂在这里看到https://dotnetfiddle.net/fw4IBw
它包括登记以下步骤
- 迭代所有的组件,并得到所有事件处理各类
迭代所有事件处理程序的类型和登记他们作为 命名(“事件处理程序“,eventHandlerType)和 .InstancePerMatchingLifetimeScope(”PerHandlerKey“);
- 在同一回路获取通知类型 在同一回路
- 寄存器每事件处理程序AsSelf和作为 implementedInterfaces
- 在同一回路寄存器每个通知类型.Named( “EventHandlerDecorator”只有一个 eventHandlerDecorator一个 eventhandlerFactory ,interfaceType ).AsSelf()。InstancePerLifetimeScope();
- 对于MultiInstanceFactory解决只有一个为 通知c.ResolveKeyed( “EventHandlerDecorator” 装饰...
在EventHandlerDecorator做..
- 解决所有工厂为每个NotificationType
- 工厂创建每个处理程序生命周期
- 创建处理程序
- 调用处理程序
也许我没有正确理解这个问题,但是你看了Autofac委托工厂,因为事件只是一个委托的特定形式? – Eris
嗨埃里斯Thx响应。是的,我已经看到了它。 autofac自动支持Func以及服务也具有代理工厂的示例。我只是想知道如果一个工厂将解决在装饰器中创建的lifetimescope中的服务。也许你认为装饰器在其构造函数中使用了Func >作为依赖项? –