Please see the code below:
public class CreatePersonHandler
: IRequestHandler<CreatePersonCommand,bool>
{
public async Task<bool> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
return true;
}
}
It works as expected i.e. the hander is reached and returns true. How do I deal with the scenario where the handler returns nothing? I want to do this:
public async void Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
//don't return anything
}
I have spent the last two hours Googling this. For example, I have looked here: Register a MediatR pipeline with void/Task response and here: https://github.com/jbogard/MediatR/issues/230.
Generally speaking, if a Task based method does not return anything you can return a completed Task
public Task Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
Now, in MediatR terms a value needs te be returned. In case of no value you can use Unit
:
public Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
return Task.FromResult(Unit.Value);
}
or, in case of some async code somewhere
public async Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
await Task.Delay(100);
return Unit.Value;
}
The class signature should then be:
public class CreatePersonHandler : IRequestHandler<CreatePersonCommand>
which is short for
public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, Unit>
In CreatePersonCommand
, IRequest
shouldn't have any response type specified :
public record CreatePersonCommand : IRequest
And in PersonCommandHandler
, IRequestHandler
would be like this :
public class PersonCommandHandler: IRequestHandler<PersonCommandHandler>
And then in your handle
method :
public async Task<Unit> Handle(CreatePersonCommand request, CancellationToken cancellationToken)
{
// Some Code
return Unit.Value;
}
Workaround solution for anyone who doesn't want to use Unit for some reason. You can create class named as VoidResult or EmptyResult then use it as return for all requests that returns nothing.
public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, VoidResult>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With