2017-02-22 3 views
2

マイコマンド:のボイド/タスク応答でMediatRパイプラインを登録

public class Command : IRequest { ... } 

マイハンドラ:

public class CommandHandler : IAsyncRequestHandler<Command> { ... } 

私のパイプライン登録(オープンジェネリックを使用していない):

services.AddTransient<IPipelineBehavior<Command>, MyBehavior<Command>>(); 

しかし、これは動作しません:Using the generic type 'IPipelineBehavior<TRequest, TResponse>' requires 2 type arguments.MyBehaviorの同じエラー。

The docsには、Unit structが記載されています。どうやって使うの?

答えて

3

ミカエルDerrieyが指摘したように、MediatRはすでにそれが必要とされない場合は、値を返さないためにIRequestIRequestHandlerIAsyncRequestHandlerを定義します。

あなたはIRequestを見れば、あなたはそれが実際にあなたがCommandを処理するとき、あなたのパイプライン動作MyBehaviorがあなたのCommandの明示的な応答を指定しなくても、デフォルトでは、応答としてUnit構造体を返しますを意味し、IRequest<Unit>から継承見ることができます。例として

public class Command : IRequest { ... } 
public class CommandHandler : IAsyncRequestHandler<Command> { ... } 

services.AddTransient<IPipelineBehavior<Command,Unit>, MyBehavior<Command,Unit>>(); 
1

私はそれを理解したと思うし、これまでのところうまくいくようだ。

public class Command : IRequest<Unit> { ... } 
public class CommandHandler : IAsyncRequestHandler<Command, Unit> { ... } 

services.AddTransient<IPipelineBehavior<Command,Unit>, MyBehavior<Command,Unit>>(); 
+1

MediatRは[ 'IRequest'(https://github.com/jbogard/MediatR/blob/master/src/MediatR/IRequest.cs#L6)特定の定義、['IRequestHandler'](https://github.com/jbogard/MediatR/blob/master/src/MediatR/IRequestHandler.cs#L23)と[' IAsyncRequestHandler'](https://github.com/jbogard/ MediatR/blob/master/src/MediatR/IAsyncRequestHandler.cs#L25)の値を返します。戻り値の型として 'Unit'を指定するのと同じ振る舞いで、ハンドラで' Unit'インスタンスを返す必要がないので、セマンティクスはあなたが達成しようとするものに近いです。 –

関連する問題