domain-driven-design - CQRS-如何为场景执行系统建模

标签 domain-driven-design cqrs

我最近开始研究我即将开始的绿色项目的CQRS和DDD。我研究了Udi Dahan,Greg Young,Mark Nijhof和其他人的大量 Material 。这些确实非常有帮助,我认为我对这些概念有很好的理解。但是,关于如何将其应用于自己的域,我仍然存在某些疑问。

我的系统基本上是一个复杂的规则引擎-其中规则将决定某些产品的最终价格。产品定义和规则将由管理员输入到系统中。管理员将使用一组预定义的属性来设计规则,这些属性可以具有预定义集中的值,例如“购买目的”(转售,出租)或自由格式值,例如 Age

每个产品都有一个基准价格,如果有规则,则规则将基本从基准价格中添加/删除。

一个非常简单的示例规则可能是:

对于产品X,IF(购买目的=转售且年龄> 25),将25 $添加到基本价格中。

因此,有两种使用该系统的用户,即管理员,他们定义了产品,规则和底价。以及根据用户通过假设用户界面输入的方案查询定价的其他用户。

我的困惑是:运行方案根本不会更改域的状态,其他任何外部系统/人员都不会对方案执行的结果感兴趣,而是对运行中的用户本人感兴趣-它返回价格的结果在运行给定方案的适用规则后进行计算。例如,用户可以选择产品X 并查询给定方案的价格,例如(购买目的=转售且年龄= 40)。同样,由于此操作根本不会更改域状态,因此我猜想它是一个查询。但是,有一个在场景中运行的规则引擎来计算最终价格,我猜可以将其归类为正在运行的域逻辑。所以-这个逻辑在哪里?这是仅在读取模型上有效的查询,还是在运行方案时需要在域模型中运行的命令?再次,感觉领域域是这些规则的地方,但是然后我如何将方案执行的结果传递给用户(感觉像是查询的方式)。也许,CQRS不是解决此特定问题的正确解决方案?

最佳答案

我在自己的域中遇到了这个确切的问题(电子计划4个医疗保健)。基本上,系统是使用域模型(写端)进行配置的。这将是定义域中的规则,产品和基准价格。域名产生了什么?事件,状态更改,发生的事情以及发生原因。现在,我要做的是在不同的“受限环境”中使用这些事件,在我的情况下,这是一个复杂的搜索引擎,可以在医生,手术室和昂贵设备的时间表中找到空闲时间。这也可能是您使用产品,基本价格和规则相关事件的一种途径,并以某种方式存储它们,以使规则引擎(位于该数据之上)可以有效地处理用户对方案的请求可能的。您很可能会发现存储更改(域)的模型与为查询假设情况而优化的模型(规则引擎)不同。您的域可能具有诸如“您不能两次指定相同的产品”或“此规则将永远不会被匹配(年龄<25 &&年龄> 25)的规则”。该域仅允许有效的状态更改。这不是规则引擎的问题。您将很想重用域中定义的规则引擎中的概念/类。抵制这种冲动。质疑它们是否真的达到了相同的目的。出于不同目的对它进行两次建模不会造成脏污或违反DRY。

关于domain-driven-design - CQRS-如何为场景执行系统建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4688696/

相关文章:

rest - CQRS 和 REST HATEOAS 不匹配

interface - CQRS 模式 - 接口(interface)

c# - 将 DDD 原则应用于 C# 存储库

.net - 查询/报告层设计问题(DDD/CQRS)

domain-driven-design - DDD是否适合各种应用?

java - 领域模型金融交易应用

java - 如何解决 IntelliJ 突出显示的未经检查的转换问题?

c# - 具有依赖注入(inject)的 CQRS

java - 洋葱架构 : Should UI project have access to Domain Layer?

domain-driven-design - CQRS如何为更具扩展性的应用做出贡献