IRequestHandler return 无效

IRequestHandler return void

请看下面的代码:

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

它按预期工作,即到达处理程序并且 returns 为真。如何处理处理程序 returns 什么都没有的情况?我想这样做:

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

我花了最后两个小时谷歌搜索这个。例如,我在这里看过: and here: https://github.com/jbogard/MediatR/issues/230.

一般来说,如果一个基于任务的方法没有 return 你可以 return 一个 completed Task

    public Task Handle(CreatePersonCommand message, CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }

现在,在 MediatR 术语中,需要 return 值。如果没有值,您可以使用 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;
    }

class 签名应为:

public class CreatePersonHandler : IRequestHandler<CreatePersonCommand>

的缩写
public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, Unit>

针对出于某种原因不想使用 Unit 的任何人的变通解决方案。您可以创建名为 VoidResult 或 EmptyResult 的 class,然后将其用作 return 用于所有 return 什么都没有的请求。

public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, VoidResult>

还有另一个名为 AsyncRequestHandler 的抽象 class,它是异步处理请求但不 return 响应的处理程序的包装器 class。

public class CreatePersonHandler : AsyncRequestHandler<CreatePersonCommand>

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;
}