2011-10-24 75 views
1

我正在编写一个使用NHibernate的应用程序,其中一个要求是为系统创建规则,这将有效地生成SQL查询以过滤数据。这些规则是应用程序用户可维护的。在C#应用程序中创建数据库独立规则 - 规则引擎?

举个例子,你可能有释放订单的规则被称为

ForeignOrders这将成立类似的东西订单(业务对象)DeliveryCountry(业务对象属性) <>英国

ExpensiveLondonAcmeOrders这将是建立像订单(业务对象)DeliveryCity(业务对象属性) = 伦敦订单总金额(业务对象属性)>东西1000 AND订单公司名称 = ACME

然后,当用户发布订单时,他们选择了他们想使用的规则模板,并且只会发布符合这些条件的订单。

业务对象和业务对象属性的名称紧密地反映了底层数据/域模型,但是如何在运行时能够在用户界面中确定并显示这些数据,然后在本质上创建where子句SQL查询。而且,一旦定义,您还需要将这些值存储在数据库中,使其与数据库平台无关。

理想情况下,我不想写这个功能 - 你可以使用规则引擎来实现这样的功能吗?如果是这样,哪些和昂贵的不是真正的选择。如果不是,那么可以使用哪些资源来掌握如何编写这些内容。

感谢您的帮助将是非常有用的

+1

请记住,人们不习惯布尔逻辑_actually_的工作方式,通常会对SQL中'AND'和'OR'条件的工作方式感到困惑,因为它们通常用于英语语言。 –

+1

啊,流行语的力量......规则引擎不会做你想让他们做的事 - 它们基本上是坐落在工作流程中并应用业务规则的机器。 –

+0

我认为我对规则引擎的理解可能不正确,因为它不是我曾经花费很多时间的东西。我只需要知道我所描述的正确术语。 – lostinwpf

回答

1

这是值得Eric Evans的阅读“领域驱动设计” - 它有很多的你问的东西的交易。具体来说,埃文斯提出了规范模式(http://en.wikipedia.org/wiki/Specification_pattern) - 一种将布尔逻辑应用于对象的方式,而无需事先知道标准是什么。

http://www.dimecasts.net/Content/WatchEpisode/139拥有的演练,还可以帮助...

+0

我是新来的,所以我不确定这是否是正确的礼节。如果是这样,道歉。我已经考虑过使用规范模式并返回一个DetachedCriteria,如果你知道你需要在构建时包含的属性的话,这很好。但是,在这种情况下,我们不这样做。要在规范中包含的属性只在运行时才知道。如何在此场景中实现规范模式? – lostinwpf

+0

你能修复你的断链吗@Neville K? – MacGyver