1

デコレータ クラスを使用して Autofac と MediatR でイベント ハンドラごとに LifeTimeScope を作成することは可能ですか?

したがって、同じイベントをリッスンする 2 つの Eventhandler があります。デコレーターは、LifteTimeScope を作成し、装飾されたイベント ハンドラーを解決し、装飾されたイベント ハンドラーの Handle メソッドを呼び出すことになっています。CommandHandlers でこれを行う例がたくさん見つかりました。以下に示すようなコードで遊んでみました。しかし、私はそれを機能させることはできません。一部の投稿では、autofac 登録ソースを作成することも提案されています。ここにフィドルを配置しました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 );
        }
    }
}
4

1 に答える 1

0

はい、可能です。

最後に、解決策を見つけました。コードはここで見ることができます https://dotnetfiddle.net/fw4IBw

登録には次の手順が含まれます

  1. すべてのアセンブリを繰り返し、すべての eventHandler タイプを取得します
  2. すべてのイベントハンドラーの型を繰り返し、それらを Named("EventHandler", eventHandlerType) および .InstancePerMatchingLifetimeScope( "PerHandlerKey" ); として登録します。

  3. 同じループで通知タイプを取得

  4. 同じループで、eventhandler AsSelf ごとに eventhandlerFactory を、implementedInterfaces として登録します。
  5. 同じループで、通知タイプごとに 1 つの eventHandlerDecorator のみを登録します。
  6. MultiInstanceFactory の場合、通知のデコレータを 1 つだけ解決します c.ResolveKeyed( "EventHandlerDecorator"...

EventHandlerDecorator で行う..

  1. NotificationType のすべてのファクトリを解決する
  2. 各ファクトリに対して、ハンドラごとにライフタイムスコープを作成
  3. ハンドラーを作成する
  4. ハンドラを呼び出す
于 2017-06-06T06:53:26.807 に答える