Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态代码-C#_C#_Architecture - Fatal编程技术网

动态代码-C#

动态代码-C#,c#,architecture,C#,Architecture,我们正在开发一种产品,将为许多客户部署。在这个产品的某个领域,我们需要执行一些公式。问题是,每个客户机的公式可能不同。因此,我们需要一个良好的体系结构,能够“动态执行代码” 该应用程序是一个托管在sharepoint 2010上的web应用程序(因此使用.net 3.5) 一个简化的例子: 我有一个类MyClassA,它有两个数字属性PropA和PropB 对于一个客户,公式为PropA+PropB。另一方面,它是PropA PropB。 这只是一个简化的例子,因为公式比这更复杂 我需要一种方

我们正在开发一种产品,将为许多客户部署。在这个产品的某个领域,我们需要执行一些公式。问题是,每个客户机的公式可能不同。因此,我们需要一个良好的体系结构,能够“动态执行代码”

该应用程序是一个托管在sharepoint 2010上的web应用程序(因此使用.net 3.5)


一个简化的例子:
我有一个类MyClassA,它有两个数字属性PropA和PropB 对于一个客户,公式为PropA+PropB。另一方面,它是PropA PropB。 这只是一个简化的例子,因为公式比这更复杂

我需要一种方法,使客户端a可以在XMl文件或数据库中设置PropA+PropB。 然后动态加载代码

这有意义吗?有人在生产环境中实现过类似的场景吗

我发现下面的文章描述了类似的情况,但我不知道它对于生产环境是否100%可靠:

我还发现IronPython也可以解决类似的问题,但我无法理解如何将ClassA与IronPython结合使用

如有任何帮助,我们将不胜感激

更新。。。 感谢大家的详细反馈。这是一项非常有建设性的工作。我已经回顾了不同的方法,我们很可能会继续nCalc方法。nCalc似乎是一个很棒的工具,我已经爱上了这项技术:) 谢谢大家

调查


您可以将计算存储在数据库字段中,然后根据需要执行它们。非常简单和强大。我们在多租户环境中使用它来帮助进行类似类型的定制

我之所以提出这一点,是因为我不太清楚这个问题,但我的想法可能是为每个公式创建一个Dll(这样您就可以随心所欲地处理代码,使用普通的C#功能,而不是不舒服的xml文件)

有了它,您可以将dll注入到代码中(在开发新的dll时只需上传这些dll,无需重新编译exe文件),并为每个客户端使用不同的公式


这是我的想法,因为它看起来像是一个完美的例子,

您是否有一套固定的公式,或者客户机是否有能力动态输入这些公式,例如计算器? 在第一种情况下,我建议如下:一组C#委托,它们以特定的顺序相互调用,以及(一个)适合委托的闭包字典。然后,将根据预定义的条件将闭包指定给代理

在另一种情况下,我不会根据客户端键入的内容编译.NET代码,因为这(除非被抢占)代表服务器端安全风险。我将为您期望的表达式实现/调整一个简单的解析器

Chris Lively的p.S.sugguested绝对是这类任务的可行选项,如果你有大量不想保存在内存中的公式,那么它比直接使用代理要好。

使用Ironpython的ClassA? 保持简单

为每个成员运行classA实例(可能是一个自定义属性,用于标记要在calc中使用的属性),最后得到name=value对,不幸的是,它看起来像一个赋值

e、 g

将其添加到python脚本之前

PropAPropB = PropA + PropB
执行作为赋值和计算的脚本

那基本上是

ClassB.PropAPropB = ipCalc.Eval("PropAPropB");
您可以开始真正地使用它,但是一个方法可以从一个实例中获取输入,一个方法可以评估计算结果并设置属性


鲍勃是你母亲的姐姐的哥哥……

对于简单的配方奶粉,有ncalc。对于复杂的情况,您可以在运行时编译C#。您考虑过MEF吗?您可以使用插件体系结构加载特定于客户端的程序集。虽然不是超级性感,但如果您编写自己的解析器,将公式作为字符串(或公式生成器)接受,该怎么办。然后把普罗帕放在上面写着普罗帕的地方?愚蠢的简单(可能太简单)就是有类似于
var formula=“A-B”的东西;公式。替换(“A”,PropA)。替换(“B”,PropB)
。然后运行您的自定义解析器来执行A减B-可能有一些很好的库用于数学部分您有关于用户的信息吗?用户在系统中的角色?然后,您可以根据有关用户的这些信息计算表单。我仍然不明白为什么需要执行动态代码。如果公式不变,您最好使用策略模式。例如,您可以使用
AddStrategy
SubstractStrategy
并根据持久化数据为给定客户机选择正确的策略。然而,对于更复杂的公式,这可能证明过于复杂;在这种情况下,您还可以将表达式树作为一种帮助您“在运行时编译代码”的方法,正如CodeInChaos所建议的那样。MEF看起来是最干净的解决方案。我需要研究如何集成到.NET3.5和sharepoint中,但我认为这是可行的。我喜欢能够为此动态注入代码的想法。它可能特别适合这种情况,因为这是开发人员最有可能改变的事情,而不是用户。(虽然如果用户可以更改公式会很好,但不是真正的要求)如果用户有可能更改公式(您必须很好地处理异常),我认为Chris answer是更好的选择感谢您的回复。。。我没有考虑过安全方面的问题。但在这种情况下,它们非常重要。我将调查nCalc,因为我以前从未使用过它。很高兴能提供帮助,但nCalc确实是克里斯的答案。我给他留了一个+1作为补充,我不能因此而获得荣誉。
ClassB.PropAPropB = ipCalc.Eval("PropAPropB");