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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-07
          • 2011-03-17
          • 2012-01-03
          • 2012-01-26
          相关资源
          最近更新 更多