DSL:DSL ルールから C# 式へ
-
09-09-2019 - |
質問
質問は複合的なものかもしれません。拡張させてください。
- それは存在しますか デザイナー (stub/framework/meta-designer) .NET オブジェクトの public bool プロパティに基づいて AND/OR ベースのルールを作成するには?任意の DSL/Boo/... として保存されます。出力。
- をコンパイルすることは可能ですか C# への DSL 出力 表現?
私たちの主な問題は、ドキュメントとコードの間にギャップがあることです。当社の製品は何百ものユーザー定義ルールに基づいており、変更リクエストを迅速化したいと考えています。
シンプルなデザイナーをユーザーに提供して出力を取得できれば、それを C#/IL コードに変換/コンパイルした後、変更リクエストのサイクルが速くなります。
私たちの問題が具体的であることは承知していますが、どんな「壁の中のレンガ」も大歓迎です。
例:
C# クラス、主題:
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 言語があれば嬉しいです。ユーザーがコードを確認できるかどうかを意味します(「DSLで出力」 この例では)、デザイナーは必要ありません。
アップデート #2
ティップをもとに表情木と見つめ合いました。数日後、DLinq に遭遇しました。私は決して DLinq の大ファンではありませんでしたが、この場合は問題の領域に非常によく当てはまります。
- 解析が簡単 (A > 2 かつ B < 4) または C = 5 式ツリーに
- このような表現を簡単に作成できます
- シリアル化/逆シリアル化が非常に簡単
- FlowLayoutPanel に基づく GUI は「式ビルダー」として正常に動作します
解決
このようなものを自分で構築することもできます。
Type.GetMembers() を使用して、クラスのすべてのパブリック プロパティのリストを取得できます。
ただし、C# コードを生成する代わりに、式ツリーを使用します。
こうすることで、ユーザーがルールを変更するときに C# コンパイラーを関与させる必要がなくなります。代わりに、ルールをデータベースに保存し、実行時にロードし、Expression.Compile() メソッドを使用して、コードを実行するために呼び出すことができるデリゲートを作成できます。
アップデート:
コメントの中で、「Expression Tress とドメイン固有言語の違いは何ですか?」という質問がありました。
答えは次のとおりです。
式ツリーとドメイン固有言語は直交したものです。
式トレスは、C# 式を表すための単なる API であり、実行時に動的にデリゲートに変換できるのが便利です。
DSL (ドメイン固有言語) は、狭い種類の問題を解決するために設計されたプログラミング言語です。
本質的に、それらはまったく異なるものです。
必要に応じて、DSL 実装の一部として式ツリーを使用できます。Linq はその目的でそれらを使用します。
ただし、あなたの場合、DSL は必要ありません。必要なのは、ルールを生成するユーザー インターフェイス (Outlook の動作方法と同様)、およびそれらのルールを実行する方法です。
UI の作成は通常の UI 開発です。
式ツリーは、ルールを実装するために使用できるものです。
他のヒント
これは、特にWindowsワークフロー財団とそのルールエンジンのための設計者は、Windowsでホストすることができることをほとんど知られていないという事実は、Visual Studioから別のフォームアプリケーションです。この方法で作成ルールは同様に実際のワークフローとは独立して評価することができる。
を参照してください。 WFシナリオのガイダンス:ワークフローデザイナーの再ホスティングとチュートリアル:WFデザイナーをホスティング