2015-10-15 16 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();  
    }  
} 
相關問題