ビジネス ルールで同じ種類の複数のオブジェクトを分析する方法
多くのシナリオでは、さまざまな種類のビジネス ルールが作成されます。また、エンジンにアサートされる各インスタンスの種類が個別に分析され、ルールに従って処理されることが期待されます。 ただし、場合によっては、特定の種類の複数のインスタンスをルールで同時に分析することがあります。
たとえば、 FamilyMember クラスのインスタンスを使用するルールについて説明します。
IF FamilyMember.Role == Father
AND FamilyMember.Role == Son
AND FamilyMember.Surname == FamilyMember.Surname
THEN FamilyMember.AddChild(FamilyMember)
このルールは、Father である FamilyMember インスタンスと、Son である別のインスタンスを識別します。 インスタンスが姓で関連付けられている場合、 Son インスタンスは Father インスタンスの子のコレクションに追加されます。 各 FamilyMember インスタンスがルールで個別に分析された場合、このシナリオでは FamilyMember には 1 つのロール (父 または 息子) しかないため、ルールは発生しません。
このため、複数のインスタンスがルールでまとめて分析されることをエンジンに示す必要があります。また、ルールの各インスタンスの 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 は、特定のルール評価のコンテキスト内でのみ使用されます。 インスタンス ID は、ポリシーの実行中にオブジェクトのインスタンスに添付されません。また、オブジェクトがアサートされる順番との関連性はありません。 各オブジェクト インスタンスは、この種類に対するすべてのルールの引数で評価されます。