2

質問はおそらく複合的なものです。拡張させてください:

  • .NET オブジェクトの public bool プロパティに基づいて AND/OR ベースのルールを作成するためのデザイナー(スタブ/フレームワーク/メタデザイナー)は存在しますか? 任意の DSL/Boo/... 出力として保存されます。
  • DSL 出力を C#式にコンパイルすることは可能ですか?

私たちの主な問題は、ドキュメントとコードの間のギャップです。私たちの製品は何百ものユーザー定義ルールに基づいており、変更要求をスピードアップしたいと考えています。

シンプルなデザイナーをユーザーに提供し、出力を取得できれば、それを C#/IL コードに変換/コンパイルした後、変更要求サイクルを迅速に行うことができます。

私たちの問題は特定の問題であることはわかっていますが、「壁の中のレンガ」は大歓迎です!

AC# クラス、対象:

public class TestA
{
     public bool B {...}
     public bool C {...}
}

デザイナーでは、作成できるはずです

  • 任意のタイプのグラフィック デザイナー (つまり、パブリック プロパティを選択するためのドロップダウン)

DSL での出力:

If TestA.B AND TestA.C Then Return True;

C# での出力:

if (testA.B && testA.C) { return true; }

更新 #1

静的型の .NET クラスの使用をサポートする DSL 言語があればうれしいです。つまり、ユーザーがコードを確認できる場合 (例では「Output in DSL」 )、デザイナーは必要ありません。

アップデート #2

ティップをもとに表情木を見つめる。数日後、私は DLinq に出くわしました - 私は DLinq の大ファンではありませんでしたが、この場合、問題のドメインに非常によく適合します。

  • 構文解析が容易(A > 2 AND B < 4) OR C = 5を式ツリーに
  • そんな表現がしやすい
  • シリアル化/逆シリアル化が非常に簡単
  • FlowLayoutPanel に基づく GUI は「式ビルダー」として正常に動作します
4

2 に答える 2

6

このようなものを自分で構築できます。

Type.GetMembers() を使用して、クラスのすべてのパブリック プロパティのリストを取得できます。

ただし、C# コードを生成する代わりに、式ツリーを使用します。

そうすれば、ユーザーがルールを変更するときに C# コンパイラを使用する必要がなくなります。代わりに、ルールをデータベースに保存し、実行時にロードしてから、Expression.Compile() メソッドを使用して、呼び出してコードを実行できるデリゲートを作成できます。

アップデート:

コメントの中で、誰かが「Expression Tress とドメイン固有言語の違いは何ですか?」と尋ねました。

答えは次のとおりです。

式ツリーとドメイン固有言語は直交するものです。

Expression tress は、C# 式を表現するための単なる API であり、実行時に動的にデリゲートに便利に変換できます。

DSL、またはドメイン固有言語は、狭いクラスの問題を解決するために設計されたプログラミング言語です。

それらは、本質的に、完全に異なるものです。

必要に応じて、式ツリーを DSL 実装の一部として使用できます。Linq はその目的のためにそれらを使用します。

ただし、あなたの場合、DSL は必要ありません。必要なのは、ルールを生成するユーザー インターフェイス (Outlook の動作に似ています) と、それらのルールを実行する方法です。

UI の作成は、通常の UI 開発です。

式ツリーは、ルールを実装するために使用できるものです。

于 2009-06-03T22:48:51.487 に答える
0

特に Windows Workflow Foundation とそのルール エンジンのデザイナーは、Visual Studio とは別の Windows フォーム アプリケーションでホストできるということはあまり知られていません。この方法で作成されたルールは、実際のワークフローとは関係なく同様に評価できます。

「 WF シナリオ ガイダンス: ワークフロー デザイナーの再ホスト」および「チュートリアル: WF デザイナーのホスト」を参照してください。

于 2009-07-12T02:21:43.133 に答える