4

我正在.NET 中创建一个工资单应用程序。要求之一是考勤和扣分规则应最大限度地动态和灵活。用户应该能够定义自己的规则,每个员工都将被绑定到一个考勤规则。

一种解决方案是即时编译 C# 代码,其中每个考勤规则的代码都存储在数据库中并在运行时编译,但这不是最优雅的解决方案,因为规则只能由技术人员阅读/理解,代码的性能和可读性也不会是最好的。

我想知道是否有解决方案\架构模式允许我定义和应用出勤规则并根据它们计算扣除额,而无需编写脚本或动态编译 C# 代码。

4

3 回答 3

2

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 中执行生成的代码,以便在规则更改时可以将其卸载。

于 2009-08-24T12:48:56.887 回答
2

依靠代码编译来改变你的系统是一个非常糟糕的做法,你不妨说“规则可以随时改变,你只需要一个开发人员”。

如果您定义了规则,您可以将参数存储在数据库中,并使用在运行时读取它们的代码应用它们。您的代码会更复杂,但这是我们为配置付出的代价。

您需要定义规则 - 即正式说明我将使用哪些参数,以及如何应用它们。

例如。如果 90% 的出勤率意味着 5% 的扣除,那么您会将这两个值存储在数据库中。然后,您的代码将获取实际出勤率,找到相应的行并应用扣除。除非您的规则非常复杂以至于无法在这样的参数中建模,否则使用配置系统是最好的方法。然后,您可以向用户提供一个简单的 GUI 来调整规则中的值。

于 2009-08-24T12:59:42.723 回答
0

您可以嵌入解释器并使用一些模板、可视化工具让您的用户添加新的代码片段。

于 2009-08-24T12:51:02.877 回答