我正在.NET中创建一个工资单应用程序。其中一项要求是出勤和扣减规则应最具活力和灵活性。用户应该能够定义自己的规则,每个员工都将受到出勤规则的约束。
一种解决方案是动态编译C#代码,其中每个出勤规则的代码存储在数据库中并在运行时编译,但这不是最优雅的解决方案,因为规则只能通过以下方式读取/理解技术人员,代码的性能和可读性也不是最好的。
我想知道是否有一个解决方案\架构模式允许我定义和应用考勤规则并根据它们计算扣除而无需编写脚本或动态编译C#代码。
答案 0 :(得分: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中执行生成的代码,以便在规则更改时可以卸载它。
答案 1 :(得分:2)
依靠代码编译来改变你的系统是一个非常糟糕的做法,你可以说“规则可以随时改变,你需要的只是一个开发人员”。
如果定义规则,则可以将参数存储在数据库中,并将其应用于在运行时读取它们的代码。您的代码会更复杂,但这是我们为配置付出的代价。
您需要定义规则 - 即正式说出我使用的参数,以及如何应用它们。
例如。如果90%的出勤率意味着扣除5%,那么您将把这两个值存储在数据库中。然后,您的代码将获得实际出勤率,找到相应的行并应用扣除。除非您的规则太复杂以至于无法在这样的参数中建模,否则使用配置系统是最好的方法。然后,您可以向用户提供一个简单的GUI,以调整规则中的值。
答案 2 :(得分:0)
您可以嵌入一个解释器并使用一些模板,可视化工具让您的用户添加新的代码片段。