私のアプリケーションでは、コマンド処理を処理する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> { }