Зарегистрируйте конвейер 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>>();
Другие вопросы по тегам