对于我的大多数应用程序,我使用直接的 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/