2009-08-24 83 views
4

我正在.NET中创建工资单应用程序。其中一个要求是出席和扣除规则应该在最大程度上是动态和灵活的。用户应该能够定义他自己的规则,其中每个员工将被绑定到出勤规则。动态业务规则体系结构

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

我想知道,如果有,可以让我定义和应用考勤规则和计算基于对他们的扣费而无需编写脚本或动态编译C#代码的解决方案\架构模式。

回答

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

0

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

2

它的一个非常不好的做法,依靠汇编代码来改变你的系统,你不妨说:“规则是可以改变的任何时候,你需要的是一个开发者”。

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

您需要定义的规则 - 即正式说什么PARAMATERS我的使用,以及它们如何被应用。

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