Зарегистрируйте конвейер MediatR с ответом void/Task
Моя команда:
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
,
В документах упоминается Unit
структура Как мне это использовать?
2 ответа
Как отметил Микаэль Дерри, MediatR уже определяет IRequest, IRequestHandler и IAsyncRequestHandler, чтобы они не возвращали значение, если оно не требуется.
Если вы посмотрите на IRequest, вы увидите, что он на самом деле наследует от IRequest<Unit>
, что означает, когда вы обрабатываете Command
ваше поведение конвейера MyBehavior
вернет Unit
struct как ответ по умолчанию без необходимости указывать явный ответ для вашего Command
,
В качестве примера:
public class Command : IRequest { ... }
public class CommandHandler : IAsyncRequestHandler<Command> { ... }
services.AddTransient<IPipelineBehavior<Command,Unit>, MyBehavior<Command,Unit>>();
Я думаю, что я понял это, и, кажется, работает до сих пор.
public class Command : IRequest<Unit> { ... }
public class CommandHandler : IAsyncRequestHandler<Command, Unit> { ... }
services.AddTransient<IPipelineBehavior<Command,Unit>, MyBehavior<Command,Unit>>();