ルールとルールセットで使用するファクト クリエータと取得コンポーネントを構築する (プレビュー)
適用対象: Azure Logic Apps (Standard)
重要
この機能はプレビュー段階にあり、「Microsoft Azure プレビューの追加使用条件」が適用されます。
ビジネス ルールの開発とテスト中にルール エンジンが使用するファクトを作成するには、ファクトクリエータを作成します。このクリエータは、エンジンに .NET オブジェクトの配列を提供します。 また、実行中に 評価のためにルールに長期的または緩やかに変化するファクトを挿入するファクト取得コンポーネント を構築することもできます。
このハウツー ガイドでは、Azure Logic Apps ルール エンジン プロジェクトで使用するファクトクリエータとファクト取得コンポーネントを構築する方法について説明します。
ファクト クリエータを構築する
ファクト インスタンスを作成するには、IFactCreator インターフェイスとそのメソッドである CreateFacts と GetFactTypes を実装します。 最初のファクト クリエータ用の .NET アセンブリ (DLL ファイル) をビルドした後、Microsoft Rules Composer のルールセット テスト機能からアセンブリを選択できます。 詳細については、「テスト ルールセット」を参照してください。
次の例は、ファクト クリエータの実装例を示しています。
public class MyFactCreator : IFactCreator
{
private object[] myFacts;
public MyFactCreator()
{
}
public object[] CreateFacts ( RuleSetInfo rulesetInfo )
{
myFacts = new object[1];
myFacts.SetValue(new MySampleBusinessObject(),0);
return myFacts;
}
public Type[] GetFactTypes (RuleSetInfo rulesetInfo)
{
return null;
}
}
ファクト取得コンポーネントを構築する
ファク取得コンポーネントは、標準メソッドを実装する .NET オブジェクトであり、通常は、エンジンがルールセットを実行する前に、それらを使用してルール エンジンに長期的かつ緩やかに変化するファクトを提供します。 エンジンはこれらのファクトをキャッシュして、複数の実行サイクルで使用します。 ファクト取得コンポーネントは、最初にファクトを送信し、必要な場合にのみメモリ内のファクトを更新します。 ルール エンジンを呼び出すたびにファクトを送信するのではなく、ファクトを初めて送信するファクト取得機能を作成し、必要な場合にのみメモリ内のファクトを更新します。
ルール エンジンにファクト インスタンスを提供するには、IFactRetrieverインターフェイスと UpdateFacts メソッドを実装 します。 その後、ルールセットのバージョンを設定して、この実装を使用して実行時にファクトを取り込むことができます。 ルールセットのバージョンは、実行サイクルごとに UpdateFacts メソッドを呼び出します。
必要に応じて、ファクト取得コンポーネントに IFactRemover インターフェイスを実装できます。 ルール エンジンは、ルール セットが破棄されるときに、IFactRemover インターフェイスから UpdateFactsAfterExecution という名前のメソッドを呼び出せます。 これにより、データベースの変更をコミットしたり、ルール エンジンの作業メモリからオブジェクト インスタンスを取り消したりするなど、実行後の作業を実行できます。
次のタスクを実行するために必要なアプリケーション固有のロジックを使用して、ファクト取得コンポーネントを設計できます。
必要なデータ ソースに接続します。
エンジンに長期的なファクトとしてデータをアサートします。
新しい長期的なファクト インスタンスをエンジンに更新またはアサートするロジックを指定します。
エンジンは、これらの値が更新されるまで、後続の実行サイクルで最初にアサートされた値とキャッシュされた値を使用します。
ファクト取得コンポーネントの実装は、取得元が factsHandleIn オブジェクトと共に使用して、既存のファクトを更新するか、新しいファクトをアサートするかを決定できるトークンに似たオブジェクトを返します。 ルールセット バージョンがファクト取得コンポーネントを初めて呼び出すと、factsHandleIn オブジェクトは常に null に設定されますが、ファクト取得コンポーネントが実行を完了した後に戻りオブジェクトの値を受け取ります。
次のサンプル コードは、ファクト取得コンポーネントを実装することにより、.NET および XML のファクトをアサートする方法を示しています。
using System;
using System.Xml;
using System.Collections;
using Microsoft.Azure.Workflows.RuleEngine;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace MyApplication.FactRetriever
{
public class myFactRetriever:IFactRetriever
{
public object UpdateFacts(RuleSetInfo rulesetInfo, RuleEngine engine, object factsHandleIn)
{
object factsHandleOut;
if (factsHandleIn == null)
{
// Create .NET object instances.
bookInstance = new Book();
magazineInstance = new Magazine();
// Create XML object instance.
XmlDocument xd = new XmlDocument();
// Load the XML document.
xd.Load(@"..\myXMLInstance.xml");
// Create and instantiate a TypedXmlDocument class instance.
TypedXmlDocument doc = new TypedXmlDocument("mySchema",xd1);
engine.Assert(bookInstance);
engine.Assert(magazineInstance);
engine.Assert(doc);
factsHandleOut = doc;
}
else
factsHandleOut = factsHandleIn;
return factsHandleOut;
}
}
}
次の機能を含めるには、ご利用のコード実装を記述します。
長期間のファクトが更新されたタイミングを確認します。
どのルール エンジン インスタンスが長期的なファクトを使用しているかを追跡します。
ルールセットのファクト取得コンポーネントを指定する
ルールセット バージョンのファクト取得コンポーネントを設定するには、 Microsoft Rules Composerで Fact Retriever プロパティを設定するか、次の例に示すように、ご利用のコードを記述します。このコードは、「MyAssembly」 という名前のアセンブリで 「MyFactRetriever」 という名前のクラスを使用します。
RuleEngineComponentConfiguration fr = new RuleEngineComponentConfiguration("MyAssembly", "MyFactRetriever");
RuleSet rs = new RuleSet("ruleset");
// Associate the execution configuration with a ruleset version.
RuleSetExecutionConfiguration rsCfg = rs.ExecutionConfiguration;
rsCfg.FactRetriever = factRetriever;
Note
RuleEngineComponentConfiguration コンストラクターの最初のパラメーター として「MyAssembly」などの単純なジェネリック アセンブリ名を使用する場合、ルール エンジンはアプリケーション フォルダー内のアセンブリを検索します。