我该如何实施配方工厂?

时间:2009-07-03 01:09:04

标签: .net vb.net

首先要求:

  • 根据管理要求,我不能使用开源代码。
  • 我需要用户为项目定义自己的公式。
  • 我的用户不知道如何编码。
  • 公式需要以某种方式保存,稍后再阅读。
  • 我需要调试所写的公式,所以我需要能够看到并理解它们。
  • 使用的公式非常专业和具体(精算公式)。
  • 必须以快速且可维护的方式添加新公式(功能)。

我做了什么?

我实现了一个抽象类,让我们说所有公式都继承自的FormulaBase:

Public MustInherit Class FormulaBase
    Public MustInherit Function Formula(ByVal p as Parameters) as Result
    Public MustInherit Function GetXML() as Text.StringBuilder
End Class

然后我创建了包含公式的类:

Public Class SumFormula
    Inherits FormulaBase

    Public Shared ReadOnly Property XMLTag() As String
        Get
            Return "sum"
        End Get
    End Property

    Private X As FormulaBase
    Private Y As FormulaBase

    Public Sub New(ByVal xmlText as Xml.XmlNode)
        ' Code to obtain read the sum parameters form XML.'
    End Sub

    Public Overrides Function Formula(ByVal p as Parameters) as Result
        Return X.Formula(p) + Y.Formula(p)
    End Function

    Public Override Function GetXml() as Text.StringBuilder
        Return New Text.StringBuilder().Append("<sum>").Append(X.GetXml()).Append(Y.GetXml()).Append("</sum>")
    End Function
End Class

然后我创建了一个工厂来构建公式,如下所示:

Public NotInheritable Class FormulaFactory
    Private Shared Formulas As Dictionary(Of String, Reflection.ConstructorInfo) = InitializeFormulas()

    Private Shared Sub Add(ByVal collection As Dictionary(Of String, Reflection.ConstructorInfo), ByVal formula as Type)
        ' Some code to extract the contructor and XmlTag from each class and add them to the dictionary.'
    End Sub

    Private Shared Function InitializeFormulas() As Dictionary(Of String, Reflection.ConstructorInfo)
        Dim Collection As New Dictionary(Of String, Reflection.ConstructorInfo)
        Add(Collection, GetType(SumFormula))
        Return Collection
    End Sub

    Public Shared Function ConstructFormula(xmlText as Xml.XmlNode) as FormulaBase
        Return DirectCast(Formulas(xmlText).Invoke(New Object(){xmlText}), FormulaBase)
    End Function
End Class

我使用更多魔术向用户显示公式,以便他们不会看到XML。要添加新公式,我只需要创建包装类,添加一个Shared XMLTag属性和一个以XMLNode作为参数的构造函数。然后我在FormulaFactory.InitializeFormulas方法中添加一行。

问题是,¿还有其他方法可以消失吗?

2 个答案:

答案 0 :(得分:1)

另一种选择可能是使用类似PublicDomain的动态代码评估。

这可以允许“snippet”只是在运行时读入并动态解析。在这种情况下,通过GUI插入公式并保存它们,加载它们并评估它们将非常容易。

答案 1 :(得分:1)

Windows Workflow Foundation的规则引擎旨在可在Visual Studio之外使用,实际上,在工作流的上下文之外。部分内容是表达式编辑器,甚至可以在规则引擎的上下文之外使用。

请参阅External RuleSet Toolkit SampleIntroduction to the Windows Workflow Foundation Rules Engine