在CQRS中,为什么命令端应该使用Repository.FindById(id)方法?

本文关键字:FindById Repository id 方法 CQRS 为什么 命令 | 更新日期: 2023-09-27 18:17:49

我已经阅读了大量关于CQRS的内容,并且理解了分离命令(写)和查询(读)操作的基本思想。

另一方面,我曾多次看到命令端的Repository<T>具有FindById(id)方法。例子:

public interface IRepository<T>
{
  void Save(T aggregate); //for add and update
  void FindById(int id);
  //no delete!
}

为什么会这样,为什么需要FindByID方法呢?它可能与检查并发性有关吗?

在CQRS中,为什么命令端应该使用Repository.FindById(id)方法?

一个非常简单的例子,使用一个用户可以给出评分的BlogPost:

public class LikeBlogPostCommand
{
    public int BlogPostId { get; private set; }
    public int Score { get; private set; }
    public LikeBlogPostCommand(int blogPostId, int score)
    {
        BlogPostId = blogPostId;
        Score = score;
    }
}

和包含业务逻辑的处理程序,它使用存储库应用命令:

public class BlogCommandHandler : ICommandHandler<LikeBlogPostCommand>
{
    // Injection not shown
    private IRepository<BlogPost> _repository;
    public void HandleCommand(LikeBlogPostCommand command)
    {
        var blogPost = _repository.FindById(command.BlogPostId);
        blogPost.AddRating(command.Score);
        _repository.Save();     
    }       
}

您应该有一个方法从数据库中获取聚合。FindById服务于此。当您遵循cqrs模式时,通常会在签名方法中使用获取聚合id的命令。in方法通过id从数据库获取聚合实体,并使用它的一个或多个方法。之后,将聚合保存回数据库。因此,存储库具有从数据库获取实体聚合的方法和将其保存到数据库的方法。

PS:表示查询不是读操作。它是查询操作:它通常返回普通模型而不是聚合。