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;
}
请看下面的代码:
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
}
我花了最后两个小时谷歌搜索这个。例如,我在这里看过:
一般来说,如果一个基于任务的方法没有 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;
}