到目前为止,这是故事:
我正在做一个C#winforms应用程序,以方便指定租用报价的设备。
其中,我有List<T>
~1500个库存商品。
这些项目有一个名为AutospecQty
的属性,它具有get
访问者,需要执行某些特定于每个项目的代码。此代码将引用列表中的各种其他项。
因此,例如,一个项目(让我们称之为Item0001
)具有此get
访问器,可能需要执行一些看起来像这样的代码:
[some code to get the following items from the list here]
if(Item0002.Value + Item0003.Value > Item0004.Value)
{ return Item0002.Value }
else
{ return Item0004.Value }
这一切都很好,但这些代码可能每周都会发生变化,所以我试图避免经常重新部署。此外,每个项目可能(将)具有完全不同的代码。有些人会查询列表,有些人会做一些长篇数学函数,有些会像上面那样简单加法......有些将取决于列表中没有的变量。
我想要做的是将每个项目的代码存储在我的数据库中的表中,然后当应用程序启动时,只需将相关代码拉出并将其打包到列表中,准备好在时间执行来了。
我在internot上看到的关于执行字符串作为代码的大多数示例看起来都很冗长,令人费解,和/或不是特别新手编码器友好(我是一个完全的业余爱好者),并且不似乎考虑到传递变量。
所以问题是:
我想这是一个非常危险的领域,无论我走哪条路。有人可以告诉我,如果我打开一罐最好的蠕虫并真正关闭吗?
有没有更好的办法解决这一切?我有一个过度复杂的习惯,我正试图踢:P
正如附加信息一样,autospec代码不会是用户输入的。这将是我每周更新它(没有其他人可以访问它),所以希望至少可以缓解一些安全问题。
如果我解释得很糟糕,请道歉。
提前致谢
答案 0 :(得分:1)
答案 1 :(得分:1)
您是否考虑过类似MEF的内容,那么您可以使用许多小型dll来实现各种版本的计算,并简单地引用从数据库中加载哪一个。
假设您可以将它们全部包装在一个(或少量)接口中。
答案 2 :(得分:1)
我会通过创建一个特定于域的语言来解决这个问题,程序可以解释该语言来执行规则。然后将DSL代码的snippits放入数据库中。
正如你所看到的,我也喜欢过于复杂的事情。 :-)但只要简化了长期使用,它就能发挥作用。
答案 3 :(得分:1)
要考虑的一些选项:
1)如果你有一个具有自动构建和部署的良好的持续集成系统,那么每周部署会出现这样的问题吗?
2)您是否考虑过MEF或类似内容,只允许您替换包含新规则的单个DLL?
3)如果公式可以简单表达(无需评估某些代码,例如A + B + C + D&gt; E + F + G + H =&gt; J或K)您可以使用反射收集参数值然后应用它们。
4)您可以在.NET 4中使用Expressions并从数据库构建表达式树,然后对其进行评估。
答案 4 :(得分:0)
您可以让程序在运行时将规则编译成一个类似于使用CSharpCodeProvider
的插件的类。
有关如何执行此操作的示例,请参阅Compiling code during runtime。