Регистрация конвейера 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 struct . Как мне его использовать?

2 2

2 ответа:

Как указал Микаэль Дерри, MediatR уже определяет IRequest, IRequestHandler и IAsyncRequestHandler, чтобы не возвращать значение, если оно не требуется.

Если вы посмотрите на IRequest, вы увидите, что он фактически наследует от IRequest<Unit>, Что означает, что при обработке Command ваше поведение конвейера MyBehavior вернет структуру Unit в качестве ответа по умолчанию без необходимости указывать явный ответ для вашего 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>>();