9

我最近开始研究 CQRS 和 DDD 以用于我即将开始的绿地项目。我从 Udi Dahan、Greg Young、Mark Nijhof 和其他人那里学习了大量材料。这些真的很有帮助,我想我对这些概念有很好的理解。但是,我仍然有一些关于如何将这些应用到我自己的领域的问题。

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

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

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

对于产品 X,如果(购买目的 = 转售和年龄 > 25)将 25 美元添加到基本价格。

所以有两种用户使用系统,管理员,他们定义产品、规则和基准价格;以及根据他们通过假设 UI 输入的场景查询定价的其他用户。

我的困惑是:运行一个场景根本不会改变域的状态,没有其他外部系统/人对场景执行的结果感兴趣,但运行用户他/她自己 - 它返回价格的结果在运行给定场景的适用规则后进行计算。例如,用户可以选择产品 X并查询给定场景的定价,例如(购买目的 = 转售和年龄 = 40). 同样,由于这个操作根本不会改变域状态,我猜它是一个查询。但是,有一个规则引擎在场景上运行来计算最终价格,我猜这可以归类为正在运行的域逻辑。那么 - 这个逻辑属于哪里?这是一个仅适用于读取模型的查询,还是运行一个需要在域模型中运行的命令的场景?再一次,感觉域层是这些规则的地方,但是我如何将场景执行的结果传递给用户(感觉就像一个查询以这种方式思考它)。或者,CQRS 不是解决这个特定问题的正确方法?

4

2 回答 2

4

我在自己的领域(电子调度 4 医疗保健)中遇到了这个确切的问题。基本上,系统是使用域模型(写入端)配置的。这将在您的域中定义规则、产品和基本价格。什么来自域?事件、状态变化、发生的事情以及发生的原因。现在我所做的是在不同的限界上下文中使用这些事件,在我的例子中是一个复杂的搜索引擎,可以在医生、手术室和昂贵设备的日程安排中找到空闲位置。这也可能是您可以采取的一种方式,使用您的产品、基本价格和规则相关事件,并以这样一种方式存储它们,即位于该数据之上的规则引擎可以像处理用户对场景的请求一样高效可能的。很可能你' 会发现存储更改的模型(域)与优化用于查询假设场景的模型(规则引擎)不同。您的域可能会有诸如“您不能两次指定同一产品”或“此规则永远不会匹配(年龄 < 25 && 年龄 > 25)”之类的规则。该域只关心允许有效的状态更改。这不是规则引擎的关注点。您会很想在您的规则引擎中重用在域中定义的概念/类。抵制这种冲动。质疑他们是否真的有同样的目的。为不同的目的对其进行两次建模并不肮脏或违反 DRY。

于 2011-01-15T12:58:36.507 回答
0

CQRS 没有说明应用程序的查询部分不应该有域逻辑。如果可行且实用,那么可以为应用程序的每个方面甚至查询单独的非规范化查询存储,但当然没有必要。

简而言之,查询就是查询,无论找到答案的任务多么复杂。

于 2011-06-19T12:59:33.313 回答