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>
Другие вопросы по тегам