Microsoft Rules Composer を使用してルールセットに関する高度なタスクを実行する (プレビュー)
適用対象: Azure Logic Apps (Standard)
重要
この機能はプレビュー段階にあり、「Microsoft Azure プレビューの追加使用条件」が適用されます。
このガイドでは、Microsoft Rules Composer でルールセットに対して実行できる、高度な操作について説明します。
前提条件
Microsoft Rules Composer をダウンロードしてインストールします。
作業するルールセットを含む XML ファイル。
ルールセットのバージョンをコピーする
既存ルールセット バージョンからコピーを作成できますが、バージョン番号は異なります。
Microsoft Rules Composer を開きます。 RuleSet エクスプローラー ウィンドウで、ルールセット バージョンのショートカット メニューを開き、[コピー] を選択します。
ルールセットのショートカット メニューを開き、[ルールセット バージョンの貼り付け] を選択します。
Microsoft Rules Composer は、コピーしたバージョンと同じ要素で、異なる番号を持つ新しいルールセット バージョンを作成します。
Note
ルールセットにファクトを提供するために使用される .NET アセンブリを更新する場合は、そのアセンブリへのルールセット バージョンの参照を更新してください。 詳細については、「.NET アセンブリ参照の更新」を参照してください。
空のルールセット バージョンを作成する
ルールセット バージョンにルールを追加した後、別の番号で新しい空のルールセット バージョンを作成し、後で作業できるようにそのバージョンを保存できます。
Microsoft Rules Composer を開きます。 ルールセットのショートカット メニューから、[新しいバージョンの追加] を選択します。
Microsoft Rules Composer により、別の番号で新しい空のルールセット バージョンが作成されます。
新しいルールセット バージョンのショートカット メニューを開き、[保存] を選択します。
これで、他のルールセット バージョンからルールをコピーし、新しいバージョンに貼り付けることができます。
ファクトの種類をルールセットに渡す
ルールセットの戻り値の型を直接指定することはできませんが、以下のいずれかの種類のファクトをルールセットに渡し、ルールセットでファクトの値を true
または false
に変更して、ルールセットの実行後にプロパティまたは要素/列の値を確認できます。
Boolean
型のプロパティを持つ .NET オブジェクトBoolean
型の要素を持つ XML ドキュメント
ルールセットのファクト取得コンポーネントを設定する
ルールセットでファクト取得コンポーネントを使用する場合は、ホスト アプリケーションの初回実行サイクルの前に、変更される頻度の低いファクトを格納できます。 こうすることで、これらのファクトをストレージから取得し、1 度だけキャッシュのためルール エンジンに適用することにより、複数の実行サイクルでフファクトを再利用できます。 詳細については、「ファクト作成コンポーネントとファクト取得コンポーネントを作成する」を参照してください。
ファクト取得コンポーネントとルールセットは、2 つの方法で関連付けることができます。
Microsoft Rules Composer でルールセット バージョンのファクト取得コンポーネントを手動で選択する。
RuleSetExecutionConfiguration
オブジェクトを使用してプログラムで実行する。
Note
1 つのルールセット バージョンには、ファクト取得コンポーネントの実装を 1 つだけ関連付けることができます。
ルールセットのファクト取得コンポーネントを手動で選択する
Microsoft Rules Composer を開きます。 RuleSet エクスプローラーで、ファクト取得コンポーネントに関連付けるルールセット バージョンを選択します。
[プロパティ] ウィンドウで、[FactRetriever] プロパティ行を選択し、省略記号ボタン ([…]) を選択して、既存のファクト取得オブジェクトを検索して選択します。
Note
省略記号ボタン ([...]) は、[プロパティ] ウィンドウで [FactRetriever] 行を選択しないと表示されません。
親ルールセットから子ルールセットを呼び出す
このタスクには、以下のいずれかのメソッドを使用します。
親ルールセットから直接
Ruleset.Execute
メソッドを呼び出す。親ルールセットから、
Ruleset.Execute
メソッドをラップするヘルパー .NET コンポーネントのメソッドを呼び出す。2 つ目のメソッドでは、
Ruleset.Execute
メソッドに前処理コードと後処理コードを追加できます。 たとえば、子ルールセットで必要とされる任意のファクトを、このラッパー メソッド内に作成できます。 以下のセクションでは、それぞれのメソッドの例を示します。
親ルールセットから直接 Ruleset.Execute メソッドを呼び出す
このセクションでは、Ruleset.Execute
メソッドを使用して親ルールセットから直接子ルールセットを呼び出す大まかな手順を説明します。 以下の手順では、XML ドキュメントをファクトとして子ルールセットに渡す Ruleset.Execute
メソッドを、アクションとして親ルールセットに追加する方法を示します。
Note
このサンプル シナリオでは、XML ドキュメントがファクトとして親ルールセットに送信されます。 このドキュメントは、ファクトとして子ルールセットに渡されます。 ただし、代わりに、子ルールセット用のファクトを作成する .NET メソッドを呼び出すこともできます。
Microsoft Rules Composer を開きます。 ファクト エクスプローラー ウィンドウで、[.NET クラス] タブを選択します。
[.NET アセンブリ] のショートカット メニューを開き、[参照] を選択します。
[.NET アセンブリ] の一覧の [Microsoft.RuleEngine] を選択し、[OK] を選択します。
[ルールセット] を展開し、[Execute(Object facts)] または [Execute(Object facts, IRuleSetTrackingInterceptor trackingInterceptor)] を [THEN] ペインにドラッグします。
[XML スキーマ] ノードを選択し、スキーマのショートカット メニューを開き、[参照] を選択します。
ファクトとして渡す XML ドキュメントのスキーマを選択し、[開く] を選択します。
ファクトとして親ルールセットに渡される XML ドキュメントを子ルールセットに渡すには、<<スキーマ名>>.xsd を Ruleset.Execute メソッドの最初の引数にドラッグします。
IRuleSetTrackingInterceptor を 2 番目の引数として受け取らない Execute メソッドを使用する場合は、以降の手順を省略します。
[.NET クラス] タブを選択し、[Microsoft.RuleEngine] の [DebugTrackingInterceptor] を、Ruleset.Execute メソッドの 2 番目の引数にドラッグします。
Note
この操作を実行した場合、クライアントは DebugTrackingInterceptor クラスのインスタンスをファクトとして親ルールセットに渡す必要があります。その後、親ルールセットはそのインスタンスをファクトとして子ルールセットに渡します。 代わりに、DebugTrackingInterceptor クラスのコンストラクターをドラッグして、インスタンスが自動的に作成されるようにすることもできます。
親ルールセットを呼び出すクライアント アプリケーションを変更する
親ルールセットを呼び出すクライアントは、子ルールセット名をパラメーターとして Ruleset クラスのインスタンスを作成し、このインスタンスをファクトとしてその他のファクトと共に親ルールセットに渡します。 この動作を説明するサンプル コードを以下に示します。
DebugTrackingInterceptor dti = new DebugTrackingInterceptor("RulesetTracking.txt");
Ruleset Ruleset = new Ruleset("ParentRuleset");
object[] facts = new object[3];
facts[0] = txd;
facts[1] = new Ruleset("ChildRuleset");
facts[2] = new DebugTrackingInterceptor("RulesetTracking2.txt");
Ruleset.Execute(facts, dti);
Ruleset.Dispose();
クライアントが BizTalk オーケストレーションの場合、式図形内にファクトを作成するコードを配置してから、ファクトをパラメーターとしてルールの呼び出し図形に渡す必要が生じることがあります。
親ルールセットからの .NET ラッパー メソッドの呼び出し
このセクションでは、Ruleset.Execute メソッドへの呼び出しをラップする .NET メソッドを、親ルールセットから呼び出す大まかな手順を説明します。
ユーティリティ .NET クラスを作成する
.NET クラス ライブラリ プロジェクトを作成します。 プロジェクトにクラスを追加します。
名前がパラメーターとして渡されるルールセットを呼び出すための
Ruleset.Execute
メソッドを呼び出す静的メソッドを追加します。以下のサンプル コードがその例です。public static void Execute(string RulesetName, TypedXmlDocument txd) { DebugTrackingInterceptor dti = new DebugTrackingInterceptor("RulesetTracking.txt"); Ruleset Ruleset = new Ruleset("ParentRuleset"); object[] facts = new object[3]; facts[0] = txd; facts[1] = new Ruleset("ChildRuleset"); facts[2] = new DebugTrackingInterceptor("RulesetTracking2.txt"); Ruleset.Execute(facts, dti); Ruleset.Dispose(); }
クライアントは親ルールセットを呼び出し、親ルールセットは子ルールセットを呼び出すヘルパー メソッドを呼び出します。以下のクライアントのサンプル コードがその例です。
facts[0] = txd; facts[1] = new RulesetExecutor(txd); // Call the first or parent ruleset. Ruleset Ruleset = new Ruleset(RulesetName); DebugTrackingInterceptor dti = new DebugTrackingInterceptor("RulesetTracking.txt"); Ruleset.Execute(facts, dti); Ruleset.Dispose();
Note
メソッドがインスタンス メソッドの場合、クライアントはヘルパー .NET クラスのインスタンスを作成し、そのインスタンスをファクトとして親ルールセットに渡す必要があります。
ルールに含まれる同じ種類の複数のオブジェクトを分析する
多くのシナリオでは、種類に対してビジネス ルールを作成すると、エンジンにアサートされた種類の各インスタンスがエンジンによって個別に分析および処理されます。 ただし、一部のシナリオでは、同じ種類の複数のインスタンスを同時にエンジンに分析させたい場合があります。 たとえば、以下のサンプル ルールでは、FamilyMember クラスの複数のインスタンスが使用されています。
IF FamilyMember.Role == Father
AND FamilyMember.Role == Son
AND FamilyMember.Surname == FamilyMember.Surname
THEN FamilyMember.AddChild(FamilyMember)
このルールにより、Father と Son からなる複数の FamilyMember インスタンスが識別されます。 インスタンスが姓で関連付けられている場合、Son インスタンスが Father インスタンスの子のコレクションに追加されます。 各 FamilyMember インスタンスがエンジンにより個別に分析された場合、FamilyMember には単一のロール (Father または Son) しかないため、ルールはトリガーされません。
そのためこのシナリオでは、エンジンが複数のインスタンスをルールでまとめて分析することを示す必要があります。また、ルールの各インスタンスの ID を区別する手段が必要です。 この機能を提供するには、インスタンス ID フィールドを使用できます。 このフィールドは、ファクト エクスプローラー上でファクトを選択すると、[プロパティ] ウィンドウで使用できます。
重要
インスタンス ID フィールドを使用する場合は、ファクトまたはメンバーをルールにドラッグする前にその値を変更してください。
インスタンス ID フィールドを使用すると、ルールが再構築されます。 FamilyMember クラスの Son インスタンスを使用するルール引数では、インスタンス ID 値を既定値の 0 から 1 に変更します。 インスタンス ID 値を 0 から変更し、ファクトまたはメンバーをルール エディターにドラッグすると、以下の例のようにインスタンス ID 値がクラスの後のルールに表示されます。
IF FamilyMember.Role == Father
AND FamilyMember(1).Role== Son
AND FamilyMember.Surname == FamilyMember(1).Surname
THEN FamilyMember.AddChild(FamilyMember(1))
ここで、Father インスタンスおよび Son インスタンスがエンジンにアサートされると仮定します。 エンジンは、これらインスタンスのさまざまな組み合わせに対してルールを評価します。 Father インスタンスおよび Son インスタンスが同じ姓であると仮定され、想定どおりに Son インスタンスが Father インスタンスに追加されます。
Note
インスタンス ID フィールドは、特定のルールの評価のコンテキスト内でのみ使用されます。 フィールドは、ルールセットの実行中にオブジェクトのインスタンスに固定されません。また、オブジェクトがアサートされる順序とも関係はありません。 各オブジェクト インスタンスは、この種類に対するすべてのルールの引数で評価されます。