2009-07-03 41 views
0

首先要求:如何实施配方工厂?

  • 通过管理的要求,我不能使用开放的源代码。
  • 我需要用户为项目定义他们自己的公式。
  • 我的用户不知道如何编码。
  • 公式需要以某种方式保存,并在稍后阅读。
  • 我需要调试编写的公式,所以我需要能够看到并理解它们。
  • 使用的公式是相当专业和特定的(精算公式)。
  • 添加新公式(功能)必须以快速和可维护的方式完成。

我做了什么?

我实现了一个抽象类,让我们说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方法中添加一行。

问题是,是否有其他方式可以离开?

回答

1

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

这可以允许“snippet”被读入并在运行时动态分析。在这种情况下,通过GUI插入公式并保存它们,加载它们并对它们进行评估将非常简单。

+0

我会检查它,但我不能使用开源。 :'( 我已经添加了要求的限制 – Wilhelm 2009-07-03 01:35:32