gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:19:34 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com