是否可以使用装饰类来为每个具有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);
}
}
}
也许我没有正确理解这个问题,但是你看了Autofac委托工厂,因为事件只是一个委托的特定形式? – Eris
嗨埃里斯Thx响应。是的,我已经看到了它。 autofac自动支持Func以及服务也具有代理工厂的示例。我只是想知道如果一个工厂将解决在装饰器中创建的lifetimescope中的服务。也许你认为装饰器在其构造函数中使用了Func >作为依赖项? –