对于我的大多数应用程序,我使用简单明了的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中的存储库不负责存储/检索实体,但负责管理聚合和构造事件流。

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

最佳答案

是的,它们是完全不同的方法:CQRS does not mean event sourcing,而是意味着将写入与读取分开。无论有没有事件源,您都可以进行CQRS,这些概念是相互正交的。

话虽这么说,很明显,对于CQR​​S风格的体系结构,您的存储库仍然负责存储和检索实体:存储库是域语言的一部分,并且该语言不受诸如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/

10-11 06:23