如何 return 使用 MediatR 创建的实体

How to return the created entity with MediatR

根据 Command Query Separation principle,命令应该 return 无效。

我正在使用 MediatR 命令请求处理程序来创建一个实体,如下所示。那么我怎样才能取回创建的实体呢?


public class CreateCompanyCommand : IRequest
{
  public string Name { get; set; } = default!;
}

public class CreateCompanyHandler : IRequestHandler<CreateCompanyCommand>
{
  private readonly IRepository<Company> _repository;

  public CreateCompanyHandler(IRepository<Company> repository)
  {
    _repository = repository;
  }

  public async Task<Unit> Handle(CreateCompanyCommand request, CancellationToken cancellationToken)
  {
    var newCompany = new Company(request.Name);
    var createdItem = await _repository.AddAsync(newCompany);
    return Unit.Value;
  }
}

我看到了this question as well as its answer here,但还是不太清楚

如何 return createdItem? Unit.Value 应该是什么?我可以修改 return 自己定制的东西而不是 Unit.Value 吗?

如果你真的想要回创建的值,你可以将你的请求/处理程序更改为return它:

public class CreateCompanyCommand : IRequest<Company>
{
  public string Name { get; set; } = default!;
}


public class CreateCompanyHandler : IRequestHandler<CreateCompanyCommand, Company>
{
  private readonly IRepository<Company> _repository;
    
  public CreateCompanyHandler(IRepository<Company> repository)
  {
    _repository = repository;
  }
    
  public async Task<Unit> Handle(CreateCompanyCommand request, CancellationToken cancellationToken)
  {
    var newCompany = new Company(request.Name);
    var createdItem = await _repository.AddAsync(newCompany);
    return newCompany;
  }
}

没有什么强迫你这样做 - 命令不应该 return CQRS 中的任何东西,但 mediatr 不会强迫你这样做。

另一种方法是在命令中创建 id(并在调用者或命令的 ctor 中初始化 id)

public class CreateCompanyCommand : IRequest<Company>
{
  public Guid Id {get; set;}
  public string Name { get; set; } = default!;
}

根据您的问题致电 mediatr,然后查询您刚创建的公司。