IRequestHandler返回void

时间:2019-02-14 10:01:02

标签: c# cqrs mediatr

请参见下面的代码:

public class CreatePersonHandler
    : IRequestHandler<CreatePersonCommand,bool>
{
    public async Task<bool> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
    {
        return true;
    }
}

它按预期工作,即到达hander并返回true。我该如何处理处理程序什么也不返回的情况?我要这样做:

public async void Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
    //don't return anything
}

最近两个小时,我一直在使用Google搜索。例如,我看过这里:Register a MediatR pipeline with void/Task response和这里:https://github.com/jbogard/MediatR/issues/230

2 个答案:

答案 0 :(得分:4)

通常来说,如果基于任务的方法不返回任何内容,则可以返回completed Task

    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>

答案 1 :(得分:2)

针对任何由于某种原因不想使用Unit的人的解决方法。您可以创建名为VoidResult或EmptyResult的类,然后将其用作所有不返回任何请求的返回。

public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, VoidResult>