我最近开始研究 CQRS 和 DDD 以用于我即将开始的绿地项目。我从 Udi Dahan、Greg Young、Mark Nijhof 和其他人那里学习了大量材料。这些真的很有帮助,我想我对这些概念有很好的理解。但是,我仍然有一些关于如何将这些应用到我自己的领域的问题。
我的系统基本上是一个复杂的规则引擎——规则将决定某些产品的最终价格。产品定义和规则将由管理员输入系统。管理员将使用一组预定义的属性来设计规则,这些属性可以具有来自预定义集合的值,例如“购买目的”(转售、出租)或自由形式的值,例如Age。
每个产品都有一个基本价格,如果适用,规则基本上会从基本价格中添加/删除。
一个非常简单的示例规则可能是:
对于产品 X,如果(购买目的 = 转售和年龄 > 25)将 25 美元添加到基本价格。
所以有两种用户使用系统,管理员,他们定义产品、规则和基准价格;以及根据他们通过假设 UI 输入的场景查询定价的其他用户。
我的困惑是:运行一个场景根本不会改变域的状态,没有其他外部系统/人对场景执行的结果感兴趣,但运行用户他/她自己 - 它返回价格的结果在运行给定场景的适用规则后进行计算。例如,用户可以选择产品 X并查询给定场景的定价,例如(购买目的 = 转售和年龄 = 40). 同样,由于这个操作根本不会改变域状态,我猜它是一个查询。但是,有一个规则引擎在场景上运行来计算最终价格,我猜这可以归类为正在运行的域逻辑。那么 - 这个逻辑属于哪里?这是一个仅适用于读取模型的查询,还是运行一个需要在域模型中运行的命令的场景?再一次,感觉域层是这些规则的地方,但是我如何将场景执行的结果传递给用户(感觉就像一个查询以这种方式思考它)。或者,CQRS 不是解决这个特定问题的正确方法?