何十万もの独立したデータ行を取り込み、ユーザーが定義した特定のルールに基づいて特定のプロパティを設定する C# アプリケーションを作成しようとしています。そのため、ルールエンジンを使用することを考えました。グーグルで調べた後、組み込みのWindows Workflow Foundation Rules Engineを使用することにしました。
ルールを作成するためのインターフェイスは、パイプとフィルター スタイルでユーザーに表示されます。
生データ -> ルール 1 -> ルール 1 の結果が True の場合、ルール 2 を実行 / ルール 1 の結果が False の場合、ルール 3 を実行 -> ... 他のルールの実行の分岐 ... -> 取られた分岐に応じて、プロパティは何らかの値に設定されています。
非連鎖ルールセットのように順次ではなく、同様のパイプおよびフィルター/分岐スタイルでルールを実行できるようにしたいと考えています。自分のフローに一致するチェーン ルールセットの依存関係を作成する方法がわかりません。WF には、このタイプの分岐専用の IfElse アクティビティがあり、同様のルールをサポートしていますが、ワークフロー アクティビティは 2 桁遅くなります。
これらのテクノロジーを間違って使用していませんか? (私は C# が初めてです) 独自のルール エンジンを作成することを検討する必要がありますか? アドバイスをいただければ幸いです。
編集:私が行った調査に関する追加の詳細。過去 1 週間で見つけたほとんどのブログ投稿 / チュートリアル / msdn リソースをググって読みました (リンクは不要です。たくさんあり、明白なキーワードを使用しました)。ルールエンジンのルールセットは、順次独立したルールに排他的に使用されるようであり、それらが依存している場合、ルール自体の依存関係である変数を変更することによってその事実を通知し、それらのルールを再評価させます ( RETE はフルチェーンと呼ばれていたと思います)。構造と関係に基づいて動的にルールに依存関係を挿入する方法がわかりません。ただし、IfElse アクティビティを使用して、この制御フローをモデル化できます。
700 行のサンプル データを含む小さなルールセットを実装し、いくつかのテストを実行しました。(コードへの貼り付けは不要です。問題はありません) それらは 50 ミリ秒以内に評価されますが、IfElse アクティビティと同じルールで構築された同等のロジックは約 50 ミリ秒で評価されます。私が推測している2秒は、アクティビティの切り替えのオーバーヘッドによるものです。私はこれらのテクノロジを正しく使用していないか (つまり、排他的なブランチで階層的に評価されるルールセットのプロパティや、より高速なスイッチング アクティビティを認識していないことを意味します)、または実行フローを制御する簡単な方法がないかのいずれかです。したがって、アクティビティでパフォーマンスが大幅に低下する必要があります。その場合は、独自のルール エンジンを作成することもできます。
編集 2:ルールセットから必要な実行フローの図