2

UIツールバー/ボタンなどの多くの構成を使用するwpfアプリがあります。関数名などに基づいて実行時にバインドされる ICommand を使用して、それらが有効/無効になっている場合など。

これらの関数のかなりの数は、実際には次のようなものです。

bool CanExecuteThisCommandIf(MyParms p){
     return MyObject != null && MyObject.Type == MyEnum.Type3
}

db テーブルの定義には次のものが含まれます。

toolbar_id
button_id
caption 
func_name
enabled_if
button_image
tooltip_text

実行されるコードは

したがって、ウィンドウ/ユーザーコントロールのコンテキストで実行されるこれらの1行関数がたくさんあります

ここで、コードでこの 1 行の関数を作成するのではなく、この関数の本体を構成テーブル自体に含める方法を探しています。

orchard、Umbraco などの CMS の詳細を読むと、彼らは管理画面でさまざまなアクションのルールを作成しているようです。これは、私が探しているものと多少似ている最小限の文法を使用しているようです。

Questions
a) is it possible to create these scriptlets
b) how ?

読んでくれてありがとう

4

1 に答える 1

0

はい、可能です。ただし、要件を緩和しない限り、それは自明ではありません。

このようなことを達成するためのいくつかの方法を次に示します。

オプション1:

トークンに基づいて疑似言語を作成 (または既存のものを検索) して、実行する必要があるアクションを記述することで、この問題に取り組むことができます。

SharePoint は、構成ファイルから動的コードを生成できる一部のフレームワークと同様に、同様のことを行います。

基本的に、XML または任意の疑似言語を使用して、メソッドの動作、パラメーター、および条件を定義します。必要に応じて、実際の C# コードを含めることもできます。

その後、その場で動的アセンブリを生成し、リフレクションを使用してツールバーのメソッドを呼び出すことができます。

詳細については、次の名前空間を参照してください。

System.CodeDom.Compiler 
System.Reflection.Emit

System.Reflection.Emit 名前空間には、動的に生成される型の一部として IL 命令を作成するために使用できる ILGenerator クラスがあります。

これはおそらく、この小さなタスクの価値よりも複雑です。

オプション 2:

もう 1 つのアプローチは、プラグイン アーキテクチャを使用し、特定のツールバー/コンポーネント関連のメソッドで DLL を動的にロードすることです (いくつかのインターフェイスに基づいているため、多くのハード コーディングなしで必要なものを簡単に実行できCommand patternます。適切なアセンブリをロードし、そのロジックを実行してコンポーネントを構成します。

これはおそらく、目前のタスクで処理したいよりも複雑です。

オプション 3:

おそらく実装が最も簡単で、小さなプロジェクトには最も理にかなっていると思います。

必要なすべてのメソッドを共通のアセンブリに含めて、常に参照することができます。次に、構成を使用して、実行時にロードするコンポーネントに応じて、呼び出すまたは実行する必要があるメソッドを決定します。これにより、複雑なオーバーエンジニアリングの必要性が回避され、同じタスクが達成されます。

オプション 3 の欠点は、新しいコンポーネントを追加または構成するたびにプロジェクトを再コンパイルする必要があることです。動的で拡張可能なアプリケーションを実際に作成しようとしているわけではなく、UI コンポーネントの構成を処理しようとしているだけなので、構成可能な新しいコンポーネント (新しいメニューまたは追加のウィジェット) を定義する場合、このオプションは理にかなっています。 )、とにかくその時点でプロジェクトを再コンパイルするのは理にかなっています。

于 2013-03-20T10:29:40.790 に答える