我们正在开发一种将为许多客户部署的产品。在本产品的某个领域,我们需要执行一些公式。问题是这个公式对于每个客户端可能是不同的。所以我们需要一个可以“动态执行代码”的良好架构
该应用程序是一个托管在sharepoint 2010上的Web应用程序(因此使用.net 3.5)
一个简化的例子:
我有MyClassA类,它有两个数字属性PropA和PropB
对于一个客户,公式为PropA + PropB。另一方面是PropA-PropB。
这只是一个简化的例子,因为公式比这更复杂。
我需要有一种方法,客户端A我们可以在XMl文件或数据库中设置PropA + PropB。 然后我会动态加载代码吗?
这有意义吗?有没有人在生产环境中实现类似的场景呢?
我发现以下文章描述了类似的情况,但我不知道它对于生产环境是否100%可靠: http://west-wind.com/presentations/dynamicCode/DynamicCode.htm
我还发现IronPython也可以解决类似的问题,但我无法理解如何将我的ClassA与IronPython一起使用。
非常感谢任何帮助。
更新...... 感谢大家的详细反馈。这是一项非常有建设性的工作。我已经回顾了不同的方法,我们很可能会继续采用nCalc方法。 nCalc似乎是一个很棒的工具,我已经爱上了这个技术:) 谢谢大家!!
答案 0 :(得分:5)
查看nCalc。
您可以将计算存储在数据库字段中,然后只需按需执行它们。非常简单而有力。我们在多租户环境中使用它来帮助进行类似类型的自定义。
答案 1 :(得分:1)
我只是提出这个问题,因为我不太清楚这个问题但是这个想法可能是每个公式的Dll(所以你可以按照自己的意愿处理代码,使用普通的C#功能而不是一个不舒服的xml文件)。
使用MEF,您可以将dll注入代码中(只需在开发新代码时上传这些代码,无需重新编译exe文件),并为每个客户端设置不同的公式。
这是我的想法,因为它看起来像Strategy pattern
的完美示例答案 2 :(得分:1)
您是否拥有一组固定的公式,或者客户是否有能力动态输入这些公式,例如计算器? 在第一种情况下,我建议如下:一组C#委托,它们以特定顺序相互调用/调用,以及(a)适合委托的闭包字典。然后根据您预定义的条件将闭包分配给代理。
在另一种情况下,我不会根据客户端输入的内容编译.NET代码,因为(除非被抢占)代表服务器端安全风险。我会为你期望的表达式实现/改编一个简单的解析器。
P.S。 Chris Lively提出的nCalc对于这类任务来说绝对是一个可行的选择,并且如果你有大量的公式而不想留在内存中,那么比直接使用代表更好。
答案 3 :(得分:0)
带有Ironpython的ClassA? 保持简单
为每个成员运行classA实例(可能是一个自定义属性来标记你想要在calc中使用的那个)并最终得到name = value对,这可能是一个不幸的巧合看起来像一个赋值
e.g
PropA = 100
PropB = 200
将其添加到您的python脚本
PropAPropB = PropA + PropB
执行作为作业和计算的脚本
然后它基本上是
ClassB.PropAPropB = ipCalc.Eval("PropAPropB");
你可以开始用它来获得真正的聪明,但是一种从实例获取输入的方法和一种评估calc的结果并设置属性的方法。
鲍勃是你母亲的姐姐的兄弟......