IRequestHandler возврат void
Пожалуйста, смотрите код ниже:
public class CreatePersonHandler
: IRequestHandler<CreatePersonCommand,bool>
{
public async Task<bool> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
return true;
}
}
Это работает, как ожидалось, т.е. Hander достигнут и возвращает истину. Как мне разобраться со сценарием, когда обработчик ничего не возвращает? Я хочу сделать это:
public async void Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
//don't return anything
}
Последние два часа я потратил на поиски в Google. Например, я посмотрел здесь: Зарегистрируйте конвейер MediatR с ответом void/Task и здесь: https://github.com/jbogard/MediatR/issues/230.
4 ответа
Вообще говоря, если метод на основе задачи ничего не возвращает, вы можете вернуть завершенную задачу
public Task Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
Теперь, в терминах MediatR, значение должно быть возвращено. В случае отсутствия значения вы можете использовать Unit
:
public Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
return Task.FromResult(Unit.Value);
}
или, в случае некоторого асинхронного кода где-то
public async Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
await Task.Delay(100);
return Unit.Value;
}
Подпись класса должна быть:
public class CreatePersonHandler : IRequestHandler<CreatePersonCommand>
что коротко для
public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, Unit>
В
CreatePersonCommand
,
IRequest
не должен указываться какой-либо тип ответа:
public record CreatePersonCommand : IRequest
И в
PersonCommandHandler
,
IRequestHandler
будет так:
public class PersonCommandHandler: IRequestHandler<PersonCommandHandler>
А потом в твоем
handle
метод:
public async Task<Unit> Handle(CreatePersonCommand request, CancellationToken cancellationToken)
{
// Some Code
return Unit.Value;
}
Обходное решение для тех, кто по какой-то причине не хочет использовать Unit. Вы можете создать класс с именем VoidResult или EmptyResult, а затем использовать его в качестве возврата для всех запросов, которые ничего не возвращают.
public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, VoidResult>
Есть еще один абстрактный класс с именем
AsyncRequestHandler
это класс-оболочка для обработчика, который асинхронно обрабатывает запрос и не возвращает ответ.
public class CreatePersonHandler : AsyncRequestHandler<CreatePersonCommand>