IRequestHandler返回void

w00*_*977 7 c# cqrs mediatr

请参见下面的代码:

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

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

public async void Handle(CreatePersonCommand message, CancellationToken cancellationToken)
{
    //don't return anything
}
Run Code Online (Sandbox Code Playgroud)

最近两个小时,我一直在使用Google搜索。例如,我看过这里:在void / Task响应中注册一个MediatR管道,在这里:https : //github.com/jbogard/MediatR/issues/230

Kav*_*eri 18

在 中CreatePersonCommandIRequest不应指定任何响应类型:

public record CreatePersonCommand : IRequest
Run Code Online (Sandbox Code Playgroud)

在 中PersonCommandHandlerIRequestHandler会是这样的:

public class PersonCommandHandler: IRequestHandler<PersonCommandHandler>
Run Code Online (Sandbox Code Playgroud)

然后在你的handle方法中:

public async Task<Unit> Handle(CreatePersonCommand request, CancellationToken cancellationToken)
{
    // Some Code 

    return Unit.Value;
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ons 16

一般来说,如果基于任务的方法不返回任何内容,则可以返回已完成的任务

    public Task Handle(CreatePersonCommand message, CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
Run Code Online (Sandbox Code Playgroud)

现在,以MediatR术语来说,需要返回一个值。如果没有价值,您可以使用Unit

    public Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
    {
        return Task.FromResult(Unit.Value);
    }
Run Code Online (Sandbox Code Playgroud)

或者,如果某处有一些异步代码

    public async Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
    {
        await Task.Delay(100);

        return Unit.Value;
    }
Run Code Online (Sandbox Code Playgroud)

然后,类签名应为:

public class CreatePersonHandler : IRequestHandler<CreatePersonCommand>
Run Code Online (Sandbox Code Playgroud)

这是短的

public class CreatePersonHandler : IRequestHandler<CreatePersonCommand, Unit>
Run Code Online (Sandbox Code Playgroud)

  • 2023 更新:从 v12.x 开始,“IRequest”不再继承自“IRequest&lt;Unit&gt;”,这意味着所有返回类型为“Task&lt;Unit&gt;”的方法都应更改为“Task”和“return Unit.Value”只是“返回”;参考:https://github.com/jbogard/MediatR/wiki/Migration-Guide-11.x-to-12.0#void-handlers-irequest-and-irequesthandler (6认同)