Drools与DDD:Drools是否需要平面对象模型?

时间:2013-02-05 17:57:27

标签: domain-driven-design drools object-model

在我们的电子商务领域,我们有一个使用嵌套数组建模的实体层次结构。我们使用领域驱动设计的原理(如Eric Evans所解释的)这样做。我们电子商务领域的核心概念是:

  • 合同,其中交换,其中每个服务付款。反过来,服务还具有描述每项服务的功能

这种分层模型使我们能够表达任何合同,无论多么复杂,包括那些拥有多个协议(即交易所)的合同,作为整体协议(或合同)的一部分。

Drools不支持这种分层对象模型吗?我是否应该将我的对象模型反转为没有数组的平面对象模型(如“Fires HAVE Rooms”和“Sprinklers HAVE Rooms”example in the Drools Expert documentation),如下所示?

  • 合同
  • 交换,每个都有一个合同。
  • 服务付款,每个都有一个Exchange。
  • 功能,每个功能都有一个服务。

我是否正确以这种方式将分层对象模型反转为具有原子断言的平面对象模型,是否支持并且在Drools中效果最好? Drools似乎不支持LHS条件规则对事实和子集合中的事实。

如果是这样,为什么Drools不支持更多的分层对象模型?是因为Drools来自AI世界(不是面向对象的世界),其中一阶逻辑将所有事实表达为原子主谓词值语句,而不是实体对象具有身份,价值的面向对象世界对象没有标识,实体对象由其他实体和值对象组成?

2 个答案:

答案 0 :(得分:1)

您可以针对任何Java对象模型定义规则。

文档提供了基于玩具问题的示例,以避免分散注意力。不是因为Drools无法处理更复杂的模型。如果您在本手册中进一步阅读,您将看到使用“包含”或累加器等语法处理列表的示例。

取决于你如何建模。您可以将合同,交易所,服务,付款和功能作为单独的事实插入,这些事实相互引用。或者,您可以插入一个复杂的合同事实,其中包含Exchange列表,其中包含服务列表等。

哪种方式更适合您,取决于您的规则是否与合同相匹配,链接很少,或者您是否希望规则对某项内容做出反应,例如更改功能或插入付款事实。

答案 1 :(得分:0)

支持对象上的嵌套访问器,因为Drools可以与任何Pojo一起使用。但是,嵌套访问器没有反应性。

作为功能请求,可以通过插入监听器来开始添加嵌套的访问者反应性。这是一项非常重要的工作,但它会非常有趣。