2017-06-02 107 views
0

是否可以使用装饰类来为每个具有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); 
     } 
    } 
} 
+0

也许我没有正确理解这个问题,但是你看了Autofac委托工厂,因为事件只是一个委托的特定形式? – Eris

+0

嗨埃里斯Thx响应。是的,我已经看到了它。 autofac自动支持Func 以及服务也具有代理工厂的示例。我只是想知道如果一个工厂将解决在装饰器中创建的lifetimescope中的服务。也许你认为装饰器在其构造函数中使用了Func >作为依赖项? –

回答

0

是其可能的。

最后我想出了一个解决方案。该代码可以蜜蜂在这里看到https://dotnetfiddle.net/fw4IBw

它包括登记以下步骤

  1. 迭代所有的组件,并得到所有事件处理各类
  2. 迭代所有事件处理程序的类型和登记他们作为 命名(“事件处理程序“,eventHandlerType)和 .InstancePerMatchingLifetimeScope(”PerHandlerKey“);

  3. 在同一回路获取通知类型

  4. 在同一回路
  5. 寄存器每事件处理程序AsSelf和作为 implementedInterfaces
  6. 在同一回路寄存器每个通知类型.Named( “EventHandlerDecorator”只有一个 eventHandlerDecorator一个 eventhandlerFactory ,interfaceType ).AsSelf()。InstancePerLifetimeScope();
  7. 对于MultiInstanceFactory解决只有一个为 通知c.ResolveKeyed( “EventHandlerDecorator” 装饰...

在EventHandlerDecorator做..

  1. 解决所有工厂为每个NotificationType
  2. 工厂创建每个处理程序生命周期
  3. 创建处理程序
  4. 调用处理程序
相关问题