使用Drools规则填充DTO

时间:2014-03-17 14:06:49

标签: jasper-reports drools

我正在使用Jasper Reports来准备包含来自业务应用程序的数据的PDF文件。在服务器上,我根据业务决策准备一个包含大量值的DTO,并将其提供给使用iReport准备的模板。因为随着时间的推移,这些商业决策的数量和复杂性都在增加,我试图看看如何将它们形式化为规则并将它们委托给Drools。

我对Drools相当新鲜;我从文学和网络资源中得到了一些例子;目前我看到有可能将空DTO与业务对象一起提供给Drools会话并让规则填充它,就像在这个最小的例子中一样:

DTO dto = new DTO();
session.insert(new Purchase(new BigDecimal("30")));
session.insert(dto);
session.fireAllRules()

规则看起来像这样:

rule "purchase over 25 dollars"
when
    $p : Purchase ( total > 25 )
    $d : DTO ()
then
    $d.setDiscount(0.15);
end

我必须承认这一切对我来说有点尴尬。我想知道是否有更清洁的方法来使用Drools准备DTO。

欢迎每一款基于Drools的解决方案。注意:在iReport模板中移动业务逻辑是不可能的。

1 个答案:

答案 0 :(得分:1)

是什么原因让你觉得这不够“干净”?每个新的编程范例对于新手来说都有些奇怪,所以再喝一杯浓咖啡并克服它。

Java代码和规则基本上都可以,如图所示。购买必然会更复杂,你的DTO也是如此。

您可以避免在Java代码中新增和插入DTO,并使用规则执行此操作;在这种情况下(以及其他原因),DTO应该与某些特定的购买链接:

rule "create DTO"
when
  $p: Purchase()
  not DTO( purchase == $p )
then
  insert new DTO( $p ) );
end

如果工作记忆中可能同时存在多个DTO,则将DTO链接到其购买也是一种很好的策略。说到这一点:你还应该考虑清理,即把事实记录下来。