2015-10-15 75 views
0

我一直在阅读大量有关CQRS的知识,并理解分离命令(写入)和查询(读取)操作的基本思想。在CQRS中,为什么命令端应该使用Repository.FindById(id)方法?

另一方面,我已经看到几次在命令端的Repository<T>功能FindById(id)方法。 例子:

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

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

+0

那么也许你可以链接到一起使用CQRS和存储库模式的教程,所以我们可以解释并向你解释它?如目前所述,这是相当无法回答的。 – CodeCaster

+0

@John你可以把这个问题提交给DDD/CQRS谷歌组https://groups.google.com/forum/#!forum/dddcqrs – vendettamit

+0

@codeCaster它在书中为企业构建应用程序 – John

回答

0

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

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

1

一个很简单的例子,采用了博文,用户可以给出一个分数:

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();  
    }  
} 
相关问题