【问题标题】:Architecture for dynamic business rules动态业务规则架构
【发布时间】:2010-11-22 06:29:07
【问题描述】:
我正在.NET 中创建一个工资单应用程序。要求之一是考勤和扣分规则应最大限度地动态和灵活。用户应该能够定义他自己的规则,每个员工都将被绑定到一个考勤规则。
一种解决方案是即时编译 C# 代码,其中每个考勤规则的代码都存储在数据库中并在运行时编译,但这不是最优雅的解决方案,因为规则只能由以下人员阅读/理解技术人员,代码的性能和可读性也不是最好的。
我想知道是否有一种解决方案\架构模式允许我定义和应用考勤规则并根据它们计算扣除额,而无需编写脚本或动态编译 C# 代码。
【问题讨论】:
标签:
.net
design-patterns
architecture
business-logic
【解决方案1】:
依靠代码编译来改变你的系统是一个非常糟糕的做法,你还不如说“规则可以随时改变,你只需要一个开发人员”。
如果您定义了规则,您可以将参数存储在数据库中,并通过在运行时读取它们的代码应用它们。您的代码会更复杂,但这是我们为配置付出的代价。
您需要定义规则 - 即正式说明我将使用哪些参数,以及如何应用它们。
例如。如果 90% 的出勤率意味着 5% 的扣除,那么您会将这两个值存储在数据库中。然后,您的代码将获取实际出勤率,找到相应的行并应用扣除。除非您的规则非常复杂以至于无法在这样的参数中建模,否则使用配置系统是最好的方法。然后,您可以向用户提供一个简单的 GUI 来调整规则中的值。
【解决方案2】:
您可以嵌入解释器并使用一些模板、可视化工具让您的用户添加新的代码片段。
【解决方案3】:
Boo 是具有可扩展编译器的成熟 .NET 语言。 Ayende 写了一本名为“Building Domain Specific Languages in Boo”的好书,他在其中讨论了扩展编译器以允许以下内容的主题:
when User.is_preferred and Order.total_cost > 1000:
add_discount_precentage 5
apply_free_shipping
when not User.is_preferred and Order.total_cost > 1000:
suggest_upgrade_to_preferred
apply_free_shipping
when User.is_not_preferred and Order.total_cost > 500:
apply_free_shipping
当编译为 .NET 程序集时,这些规则将执行得非常快。但是,您确实需要在另一个 AppDomain 中执行生成的代码,以便在规则更改时可以将其卸载。