我正在开发一个“智能”问题跟踪应用程序,需要确定在实际允许提交之前是否可以在故障单中提交特定问题。
我目前遇到的设计问题是,我可以使用许多不同类型的“可提交”问题,每个问题都有自己独特的业务逻辑,可以确定问题是否可以实际提交。根据我的设计说明,我有以下条件:
这个想法几乎就像一个保险处理应用程序,但所有信息都是通过询问货物提供的,而不是必须依赖用户输入(例如,我不需要询问货物何时发送,我可以问它的PickupDate的装运对象,并且只有两个结果:1)问题可以打开一个案例,或者2)不,问题不能有案例(又名“艰难的运气”选项)。在体系结构方面,即使我使用某种可支持多种类型问题的STRATEGY
模式,也需要为每个派生类型的问题创建自定义类。例如,我需要一个DamageClaimIssue
和一个CancellationRequestIssue
,谁知道还有什么;这在开发人员方面似乎很麻烦,因为几乎可以随心所欲地添加新类型,并且需要开发人员启动新的派生类并实现验证逻辑,然后重新编译和重新部署。
使用策略是解决此类问题的最佳方式,还是我忽略了某些事情?理论上我想使架构足够通用以适应不同的问题(我知道会有超过2-3个,我只是不知道它们究竟是什么),但我不想去使用XML或类似工具的一些单片工作流引擎的路线,可以让动态逻辑动态定义。我必须使用标准的.NET 3.5库(即没有像WCF或Workflow Foundation那样)。
是否有任何建议或指示让我朝着正确的方向前进?
答案 0 :(得分:2)
这里要问的第一件事是:谁将负责在您的系统中定义新类型的问题?
当我理解正确时,它应该是用户(可能不是每个用户,而是“高级用户”),而不是系统的开发人员。因此,您需要一个通用的问题类型,或者一些不应该太具体的问题类型,并且可以通过用户给出的参数进一步细化。关于验证/业务规则:您可以尝试为此定义DSL,用户可以自行定义这些规则。此DSL中定义的规则可以存储为类型定义的一部分,可能存储在数据库中,因此在验证适用时,引擎必须解释DSL代码。
当然,困难的部分是为您的目的定义一个好的DSL,很容易被用户理解并且足够灵活,让他们描述他们需要的每个规则。
答案 1 :(得分:0)
我认为Doc的答案很好,虽然我会首先调查规则引擎,因为它听起来像你需要的东西。为什么重新发明轮子?您应该能够找到开源和付费版本。
我们最近使用了一个名为iLog的IBM工具的.Net端口;我可以说它没有痛苦,但它完成了这项工作。从内存中,用户可以在Excel中编辑规则并导入到应用程序中。
我必须尽可能保持简单的建议。很可能某个地方会有一个优雅的“混乱”规则等(这本身就很复杂)确保你保持其他一切尽可能简单 - 你不需要复杂/凌乱的部署/升级/版本控制情况。
答案 2 :(得分:0)
我建议使用Java中的drools等业务规则引擎系统。