design-patterns - 将 CQRS 与 DDD 相结合?

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

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

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

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

最佳答案

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

话虽如此,很明显,对于 CQRS 风格的架构,您的存储库仍然负责存储和检索实体:存储库是领域语言的一部分,并且这种语言不受 CQRS 或非 CQRS 等架构选择的影响.这是 CQRS 应用程序的典型存储库接口(interface),与非 CQRS 应用程序相同;此外,无论您是否使用事件溯源,它都保持不变。

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

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

}

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

关于design-patterns - 将 CQRS 与 DDD 相结合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25577245/

相关文章:

java - 如何在派生类中共享方法而不包含在基类中

java - 在java中实现映射器的最佳方法是什么?

c# - Web 应用程序中的单例模式

design-patterns - 使用状态模式的对象应该如何转换到下一个状态?

domain-driven-design - 领域驱动设计如何处理报告?

validation - 允许系统适应人为错误的实践?

c - 在不被键盘记录器检测到的情况下向应用程序发送 key 的替代方法是什么?

java - 设计问题: Should UI layer worry about it's backend?

domain-driven-design - 为什么传奇(又名流程管理器)包含内部状态,为什么它们会持久化到事件存储中?

domain-driven-design - DDD - 如何处理 "returning domain events"模式中的事务?