2014-08-29 57 views
4

對於我的大多數應用程序,我使用直接DDD方法,這意味着將體系結構分離爲洋蔥體系結構的常見層,將域從基礎結構中解封等。兩個經常重複的構建塊,存儲庫和事件總線,像這樣(簡化):CQRS和DDD是如何協同工作的?

public interface IRepository<TEntity, TKey> 
    where TEntity : EntityBase<TKey> 
{ 

    void Add(TEntity entity); 

} 

public interface IEventBus { 

    void Publish<TEvent>(TEvent @event) 
     where TEvent : IEvent; 

} 

最近,我開始尋找到CQRS我又認識了很多類似的圖案,如倉庫,事件&指令總線。但是,例如CQRS中的存儲庫不負責存儲/檢索實體,而是負責管理聚合和構建事件流。

現在我想知道..兩個人一起工作嗎?還是他們完成不同的方法,只是分享一些共同的東西?

回答

14

是的,他們是完全不同的方法:CQRS does not mean event sourcing,而是意味着分隔寫入從讀取。你可以做和沒有事件源的CQRS,這些概念是相互正交的。這就是說,很明顯,使用CQRS風格的體系結構,您的存儲庫仍然負責存儲和檢索實體:存儲庫是域語言的一部分,並且此語言不受架構選擇的影響,例如CQRS或非CQRS。以下是CQRS應用程序的典型存儲庫接口,與非CQRS應用程序的接口相同;另外,如果您正在使用事件採購,它仍然是一樣的。

public interface IRepository<TEntity, TKey> 
    where TEntity : EntityBase<TKey> 
{ 

    void Add(TEntity entity); 
    void Save(TEntity entity); 
    TEntity retrieveByKey(TKey key); 

} 

現在,如果你使用事件採購是,你的資料庫實現,這是基礎設施建設,將,例如,查詢關係數據庫和組裝,從該行中找到的數據實體爲那個特定的關鍵。如果您使用事件採購,則您的存儲庫將負責查詢事件存儲,並將事件流投影到要返回的實體的當前狀態。所有這些都是實現的一部分,而不是存儲庫接口的興趣。

+2

很好的答案! +1 – 2014-08-30 14:02:49

+0

非常感謝您的全面解釋。我不知道CQRS不會自動意味着事件採購。 – xvdiff 2014-08-31 21:39:28