domain-driven-design - 在领域驱动设计的 CQRS 实现中为命令/查询单独应用服务?

标签 domain-driven-design cqrs command-query-separation ddd-service

在使用领域驱动设计实现 CQRS 时,我们将命令界面与查询界面分开。

我的理解是,在域级别,这显着降低了域模型中的复杂性(尤其是在使用事件源时),因此您的读取模型将与您的写入模型不同。所以这看起来像是一个单独的域服务,用于您的读写有界上下文。

在应用层面,我们域的读写分离是否需要单独的应用服务?

在这件事上,我一直在扮演魔鬼的拥护者。我的想法是这可能有点矫枉过正,要求客户知道其中的区别。但后来我想到了消费网络服务可能会如何使用它。一般情况下,它会发出读取请求和写入请求,这意味着它已经知道了。

我看到了更清洁的应用程序服务的好处。

最佳答案

真正的值(value)是拥有一个正确分离的读取和域模型。他们做根本不同的事情。并且通常具有非常不同的形状。例如,读取模型完全有可能包含来自不同域对象的数据的混合。

当您考虑如何使用它们以及应用程序中的功能时,您就会开始意识到分离的必要性。这里的经典示例是考虑与典型应用程序中的读取相比的写入次数。读取的数量远远超过写入的数量。通过保持差异,您可以针对各自的角色优化每一方。

要记住的另一个方面是“帖子”将构成一个命令,而不是可能包含读取模型的 View 模型。如果使用 CQRS 方法,您需要调整查询和发布的方式。事实上,您可以获得一种更具描述性的语言,而不是简单地将 View 模型来回反射(reflect)到服务器。

如果您有兴趣,我有一篇博客文章,其中概述了典型 CQRS 架构的高级概述。你可以在这里找到它: A step by step overview of a typical CQRS application 。希望你觉得它有用。

最后一点。我们正在添加新功能,并发现分离非常有用。一侧的变化不会以与它们可能相同的方式影响另一侧。

关于domain-driven-design - 在领域驱动设计的 CQRS 实现中为命令/查询单独应用服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36598035/

相关文章:

ruby - "Command-Query Separation"规则的异常(exception)情况?

Django 和领域层

domain-driven-design - DDD、外部数据和存储库

c# - 我应该如何在 C# 中实现我的存储库 (DDD) 以处理对同一聚合根的多个调用

c# - 如何避免 MediatR 请求处理程序中的代码重复?

c# - 事件溯源基础设施实现

service - DDD 在存储库中使用服务

cqrs - CQRS/事件源/事件总线/时序

c# - Autofac 解决 CQRS CommandDispatcher 中的依赖关系

c# - 当命令需要结果数据时,如何应用命令查询分离 (CQS)?