6

私のアプリケーションでは、コマンド処理を処理するMediatrのわずかに変更されたバージョンがあります。プリ プロセッサとポスト プロセッサを使用できるようにする MediatorPipeline を実装しました。

public class AsyncMediatorPipeline<TRequest, TResponse> 
    : IAsyncRequestHandler<TRequest, TResponse> 
    where TRequest : IAsyncRequest<TResponse>
{
    private readonly IAsyncRequestHandler<TRequest, TResponse> inner;
    private readonly IAsyncPreRequestHandler<TRequest>[] preRequestHandlers;
    private readonly IAsyncPostRequestHandler<TRequest,TResponse>[] postRequestHandlers;

    public AsyncMediatorPipeline(IAsyncRequestHandler<TRequest, TResponse> inner, 
        IAsyncPreRequestHandler<TRequest>[] preRequestHandlers, 
        IAsyncPostRequestHandler<TRequest, TResponse>[] postRequestHandlers)
    {
        this.inner = inner;
        this.preRequestHandlers = preRequestHandlers;
        this.postRequestHandlers = postRequestHandlers;
    }

    public async Task<TResponse> Handle(TRequest message)
    {
        foreach (var preRequestHandler in preRequestHandlers)
        {
            await preRequestHandler.Handle(message);
        }

        var result = await inner.Handle(message);

        foreach (var postRequestHandler in postRequestHandlers)
        {
            await postRequestHandler.Handle(message, result);
        }

        return result;
    }
}

次のように、プリプロセッサを autofac に登録しています。

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .As(type => type.GetInterfaces()
        .Where(type => type.IsClosedTypeOf(typeof(IAsyncPreRequestHandler<>))))
    .InstancePerLifetimeScope();

実行時にプリプロセッサが重複しています。重複を削除するセットをフィルタリングする必要があります。なぜこれが起こっているのかわかりません。登録をコメントアウトすると、プリプロセッサが取得されません。これは、登録を別の場所に複製していないことを示しています。

更新: 2 回登録されているように見えるタイプの詳細を以下に示します。さまざまなクラス定義:

コンクリートハンドラー

public class ClientEditorFormIdentifierValidationHandler 
: IAsyncPreRequestHandler<AddOrEditClientCommand>{}

コマンドクラス

public class AddOrEditClientCommand 
: IAsyncRequest<ICommandResult>{}

コマンドインターフェース

public interface IAsyncRequest<out TResponse> { }
4

1 に答える 1