【问题标题】:Combining CQRS with DDD?将 CQRS 与 DDD 相结合?
【发布时间】:2014-10-23 23:52:37
【问题描述】:

对于我的大多数应用程序,我使用直接的 DDD 方法,这意味着分离 Onion 架构的各个层,将域与基础架构解耦,等等。两个经常出现的构建块,存储库和事件总线,请看像这样(简化)。

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 中的存储库不负责存储/检索实体,而是负责管理聚合和构造事件流。

现在我想知道:他们两个一起工作吗?或者它们是完全不同的方法,只是共享一些共同点?

【问题讨论】:

    标签: design-patterns architecture domain-driven-design cqrs


    【解决方案1】:

    是的,它们是完全不同的方法:CQRS does not mean event sourcing,而是意味着将写入与读取分开。您可以使用或不使用事件溯源来执行 CQRS,这些概念是相互正交的。

    话虽如此,很明显,对于 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);
    
    }
    

    现在,如果您正在 使用事件溯源,那么作为基础架构的存储库实施将例如查询关系数据库并根据该特定键的行中找到的数据组装实体。如果您正在使用事件溯源,那么您的存储库将负责查询事件存储,并将事件流投影到要返回的实体的当前状态。所有这些都是实现的一部分,与存储库接口无关。

    【讨论】:

    • 非常感谢您的全面解释。我不知道 CQRS 并不自动意味着事件溯源。
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 2020-03-20
    • 1970-01-01
    • 2018-08-12
    • 2019-03-01
    • 1970-01-01
    • 2017-05-12
    • 2018-06-24
    相关资源
    最近更新 更多