2

我不太确定设计我称之为“参数”搜索或规则引擎的最佳方法是什么。我有一个包含多个字段的 Java 对象。我将针对几个查询运行 java 对象,以查看它是否符合某些条件。

我能想到的一个例子是 bugzilla 中的错误搜索功能。在 UI 中,您可以选择状态、分辨率、严重性等内容。然后点击 go,它会返回符合该条件的错误。我想这是通过从 UI 中选择的字段生成 SQL 查询来实现的。

就我而言,包含值的对象不在数据库中,因此这不是显而易见的答案。我的对象也相当复杂,需要添加多个表......而且创建数据库表然后使用数据库中的查询引擎似乎有点骇人听闻。此外,在我的应用程序中,用户基本上创建了这些映射,并且需要将它们保存到数据库中。因此,在这种情况下,您最终会将原始 sql 查询字符串保存到数据库中,这对我来说听起来像是一个严重的安全问题。(但是,我不是数据库专家,所以也许这就是事情的完成方式)。

在这一点上,我真的在寻找一些指导。我希望我想要完成的事情有某种类型的设计模式。我尝试在谷歌上搜索“参数搜索设计模式”和“规则引擎”等各种内容,但没有找到任何相关的内容。这是 LINQ 会解决的问题吗?我简单地看了看它,似乎这也太过分了。

提前致谢。

编辑1:
这里有一些额外的细节,我希望能澄清到目前为止的评论。我想让用户创建一些规则,例如对象 foo.getTemperature() >= 30 并且 foo.getTypeOfMsg() == Alert。然后,检索“警报”设置对象。如果 foo.getTypeOfMsg() == "Test" 则获取 "Test" 对象。规则是用户驱动的,因此有无限的可能性。对象 foo 由 Web 服务检索,我无需将其存储在数据库中。

4

2 回答 2

3

如果您不使用数据库来存储您的对象,那么除了“生成 SQL 查询”部分之外,其他一切都是一样的。你应该看的是规范模式。您的规范对象基本上有一个名为 IsSatisfiedBy 的方法,该方法接收对象以查看它是否符合规范。根据用户输入向规范添加某种参数似乎是一个非常简单的练习,听起来它适用于您的情况。

不确定我是否理解有关“映射”的部分,但由于您没有生成原始 SQL 查询,因此只需确保您的规范对象是可序列化的,并根据需要保留它。

LINQ 可以像普通的 C# 或 Java 一样做到这一点。

于 2009-09-11T23:34:59.303 回答
0

您是在尝试制作一种数据驱动的解决方案,一种可以由用户或其他人任意修改的解决方案,还是您正在寻找内部驱动的解决方案。

用户驱动的解决方案具有在构建时未知的无限可能性,但它需要某种 UI。您必须将解决方案与 UI 联系起来(例如,显示一个表格并允许他们单击以对给定的行/行进行排序,也许让他们每行输入“过滤条件”)所以我不确定您的搜索有什么优势会提供..

内部驱动的解决方案具有固定数量的可能性,这些可能性在构建时都是已知的。你可以很容易地编写每一个代码——也许不像你描述的那样容易,但也不会太难,因为你必须实现的解决方案数量有限。

于 2009-09-11T23:59:47.190 回答