2012-02-15 14 views
3

私たちは、多数のクライアントに展開される製品を開発しています。この製品の領域では、いくつかの数式を実行する必要があります。問題は、この数式がクライアントごとに異なる可能性があることです。私が持っている
:だから我々は、アプリケーションがSharePoint 2010の(それによって、使用して.NET 3.5)動的コード - C#


簡略化した例でホストされているWebアプリケーションです

「を動的にコードを実行」することができます良いアーキテクチャを持っている必要がありますPropAとPropBという2つの数値プロパティを持つクラスMyClassA 1つのクライアントでは、式はPropA + PropBです。もう一つはPropA-PropBです。 これは数式がこれより複雑なため、これは単なる単純な例です。

クライアントAがPropA + PropBをおそらくXMlファイルまたはデータベースに設定できる方法が必要です。 私はコードを動的に読み込みますか?

これは意味がありますか?実働環境で誰もが同様のシナリオを実装していますか?

私は以下の記事は、似たような状況を説明することを発見したが、私はそれが本番環境のための100%の信頼性があるかどうかわからない: http://west-wind.com/presentations/dynamicCode/DynamicCode.htm

私はまた、IronPythonのでも同様の問題を解決できることを見出したが、 IronPythonでClassAをどのように使用するのか分かりません。

ご協力いただければ幸いです。

更新... 詳細なフィードバックをいただきありがとうございます。それは非常に建設的な運動でした。私はさまざまなアプローチを見直し、nCalcのアプローチを進める可能性が高いようです。 nCalcはすばらしいツールであると思われ、私はすでにテクノロジーを愛しています:) ありがとうございました!

+1

簡単な公式の場合、ncalcがあります。複雑な場合は、実行時にC#をコンパイルできます。 – CodesInChaos

+1

MEFを考えましたか?クライアント固有のアセンブリをロードするには、プラグインアーキテクチャを使用できます。 – sarvesh

+1

スーパーセクシーではありませんが、式を文字列(または式ビルダー)として受け入れる独自のパーサーを作成するとどうなりますか? PropAと書かれているPropAを本質的にポップしますか?愚かな単純な(たぶん単純すぎる) 'var formula =" A - B "のようなものを持つことです。 formula.Replace( "A"、PropA)。置き換えます( "B"、PropB)。次に、カスタムパーサを実行してマイナスBを実行します。おそらく数学の部分には良いライブラリがあります – Prescott

答えて

5

nCalcを参照してください。

データベースのフィールドに計算結果を格納し、必要に応じて計算を実行するだけで済みます。シンプルでパワフル。これをマルチテナント環境で使用して、同様のタイプのカスタマイズを支援しています。

1

私はこの問題を非常にうまく認識していませんが、その考え方は各式のDllになる可能性があるので、これを提案しています(あなたが望むようにコードを処理でき、不快なxmlファイル)。

MEFを使用すると、コードにdllを注入できます(新しいものを開発するときにアップロードするだけで、exeファイルを再コンパイルする必要はありません)。

これはStrategy pattern

+0

MEFは最もクリーンなソリューションのようです。私は.net 3.5とsharepointに統合する方法を調査する必要がありますが、それは実行可能だと思います。私はこのためにコードを動的に注入できるという考えが好きです。これは特に、開発者がユーザーではなく変化する可能性が高いため、このケースでは適切です。 (ただし、ユーザーが数式を変更できるのは本当にいいですが、実際には必要条件ではありません) –

+0

ユーザーが式を変更する可能性がある場合は、クリスが答えが良いと思います。 –

1

のための完璧な例のように見えるので、あなたが式の固定セットを持っていますか、またはクライアントが動的に電卓用として、すなわち、中のものを入力する能力を持っていない私の考えているのですか? 最初のケースでは、私は次のことをお勧めします:特定の順序でお互いを呼び出す/呼び出すC#代理人のセット、および(a)代理人に適合するクロージャのディクショナリ。クロージャは、定義済みの条件に基づいてデリゲートに割り当てられます。

代わりに、クライアントのタイプに基づいて.NETコードをコンパイルしません。これは、(優先されない限り)サーバー側のセキュリティリスクを表すためです。私は、あなたが期待している式のための簡単なパーサを実装/適応します。

P.S. nCalc Chris Livelyによってsugguestedされている間違いなく、この種のタスクのための実行可能なオプションであり、メモリに保存したくないたくさんの数式を持っている場合は、代理人を直接使用するよりも優れています。

+0

ありがとうあなたの返信。 ...私はセキュリティ面については考えていませんでした。この場合は非常に重要です。 nCalcについては、以前は一度も使ったことがないので、調査します。 –

+0

助けてくれてうれしいですが、nCalcは本当にChrisの答えでした。私は彼に補完するために+1を残しました、私はそれを信用できません。 –

0

ClassA with Ironpython? 簡潔に保つ

メンバーごとにclassAインスタンスを実行します(calcで使用したいものをマークアップするためのカスタム属性かもしれません)。名前=値のペアになります。これは不幸な偶然のように見えますあなたのPythonスクリプトに

PropAPropB = PropA + PropB 

はスクリップを実行することを割り当て

例えば

PropA = 100 
PropB = 200 

前に追加割り当てと計算

である、それは基本的に

ClassB.PropAPropB = ipCalc.Eval("PropAPropB"); 

だあなたはそれを本当の巧妙な取得を開始することができますが、メソッドはインスタンスからの入力と1つのevaluatiosにCALCの結果を得るためにトンプロパティを設定します。

ボブはお母さんの妹の兄弟です...