首先要求:
我做了什么?
我实现了一个抽象类,让我们说所有公式都继承自的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方法中添加一行。
问题是,¿还有其他方法可以消失吗?
答案 0 :(得分:1)
另一种选择可能是使用类似PublicDomain的动态代码评估。
这可以允许“snippet”只是在运行时读入并动态解析。在这种情况下,通过GUI插入公式并保存它们,加载它们并评估它们将非常容易。
答案 1 :(得分:1)
Windows Workflow Foundation的规则引擎旨在可在Visual Studio之外使用,实际上,在工作流的上下文之外。部分内容是表达式编辑器,甚至可以在规则引擎的上下文之外使用。
请参阅External RuleSet Toolkit Sample和Introduction to the Windows Workflow Foundation Rules Engine。