如何获取任务中返回的整数值<;int>;格式-Asp.net核心MVC-MediaTr
将记录保存到数据库后,我需要获取将从域层返回的Id。为此,我使用了MediaTr库的功能如何获取任务中返回的整数值<;int>;格式-Asp.net核心MVC-MediaTr,asp.net,asp.net-mvc,asp.net-core,mediatr,Asp.net,Asp.net Mvc,Asp.net Core,Mediatr,将记录保存到数据库后,我需要获取将从域层返回的Id。为此,我使用了MediaTr库的功能 public class PessoaCommandHandler : CommandHandler, IRequestHandler<RegisterNewPessoaCommand, int>, IRequestHandler<UpdatePessoaCommand, int>, IRequestHandler<RemovePessoaCommand
public class PessoaCommandHandler : CommandHandler,
IRequestHandler<RegisterNewPessoaCommand, int>,
IRequestHandler<UpdatePessoaCommand, int>,
IRequestHandler<RemovePessoaCommand, int>
{
private readonly IPessoaRepository _pessoaRepository;
private bool _allowEndTransaction;
private readonly IMediatorHandler Bus;
public PessoaCommandHandler(IPessoaRepository pessoaRepository,
IUnitOfWork uow,
IMediatorHandler bus,
INotificationHandler<DomainNotification> notifications) : base(uow, bus, notifications)
{
_pessoaRepository = pessoaRepository;
_allowEndTransaction = true;
Bus = bus;
}
public Task<int> Handle(RegisterNewPessoaCommand message, CancellationToken cancellationToken)
{
if (!message.IsValid())
{
NotifyValidationErrors(message);
return Task.FromResult(0);
}
var pessoaModel = new Pessoa(message.PessoaNatureza);
_pessoaRepository.Add(pessoaModel);
return Task.FromResult(pessoaModel.Id);
}
}
公共类PessoaCommandHandler:CommandHandler,
IRequestHandler,
IRequestHandler,
IRequestHandler
{
私人只读IPESSOareposatory存储库;
私人买卖;
专用只读IMediatorHandler总线;
公共PESSOACOMMANDHANDLENDER(IPESSOAREPOSOAREPOSITORY pessoaRepository,
I工作单元uow,
IMediatorHandler总线,
INotificationHandler通知):基本(uow、总线、通知)
{
_pessoaRepository=pessoaRepository;
_allowEndTransaction=true;
总线=总线;
}
公共任务句柄(RegisterNewPessoaCommand消息,CancellationToken CancellationToken)
{
如果(!message.IsValid())
{
NotifyValidationErrors(消息);
返回Task.FromResult(0);
}
var pessoaModel=new Pessoa(message.PessoaNatureza);
_pessoaRepository.Add(pessoaModel);
返回Task.FromResult(pessoaModel.Id);
}
}
现在,让我们来讨论问题:
我需要获取“Result”属性中的整数值,并将其放入personId变量中,但我不知道如何做到这一点。有人知道怎么做吗
public void Register(PessoaViewModel pessoaViewModel)
{
var registerCommand = _mapper.Map<RegisterNewPessoaCommand>(pessoaViewModel);
var pessoaId = Bus.SendCommand(registerCommand);
}
公共无效寄存器(PessoaViewModel PessoaViewModel)
{
var registerCommand=_mapper.Map(pessoaViewModel);
var pessoaId=Bus.SendCommand(寄存器命令);
}
打开
任务返回的值的最简单方法可能是使用异步/等待
尽管如此,您还是希望尽量避免使用async void
方法,因为这会导致一个无法等待的“fire-and-forget”方法(这可能会变成一场调试噩梦,因为任何异常都会丢失到void中,等等)——因此让Register方法返回一个任务来代替:
异步公共任务寄存器(PessoaViewModel PessoaViewModel)
{
var registerCommand=_mapper.Map(pessoaViewModel);
var pessoaId=等待总线发送命令(寄存器命令);
//根据需要使用“pessoaId”
}
如果由于某种原因,async
/await
不可用,也可以使用以下选项(但请注意,此选项是同步的,将阻止当前线程执行等):
公共无效寄存器(PessoaViewModel PessoaViewModel)
{
var registerCommand=_mapper.Map(pessoaViewModel);
var pessoaId=Bus.SendCommand(registerCommand.GetAwaiter().GetResult();
//根据需要使用“pessoaId”
}
为了完整起见,我要补充的是,还可以使用Bus.SendCommand(registerCommand.Result)代码>但这通常被认为是不好的做法,因为它会混淆聚合异常中的任何异常,等等
另外,对于一个类似的问题,也就是如何展开的问题,给出了可靠的答案