ファクト取得機能は、実行中に長期的なファクトのインスタンスをポリシーにアサートするために使用されるコンポーネントです。 IFactRetriever インターフェイスを実装し、この実装を実行時に使用して長期的なファクト インスタンスを取り込むポリシー バージョンを構成できます。 特定のバージョンに対してファクトレトリバーが構成されている場合、ポリシー バージョンは、すべての実行サイクルでファクトレトリバー実装の UpdateFacts メソッドを呼び出します。
必要に応じて、ファクトレトリバー コンポーネントに IFactRemover インターフェイスを実装できます。 ルール エンジンは、ポリシーが破棄されるときに IFactRemover インターフェイスの UpdateFactsAfterExecution メソッドを呼び出します。 これにより、データベースの変更のコミットや、ルール エンジンの作業メモリからのオブジェクト インスタンスの取り消しなど、実行後の作業を行うことができます。
ポリシーのファクト取得元を指定するには
次のコードを使用して、"MyAssembly" という名前のアセンブリ内の "Retriever" という名前のクラスをファクトレトリバーとして使用するようにルール セットを構成できます。
RuleEngineComponentConfiguration fr = new RuleEngineComponentConfiguration("MyAssembly", "Retriever");
RuleSet rs = new RuleSet("ruleset");
// associate the execution configuration with a ruleset
RuleSetExecutionConfiguration rsCfg = rs.ExecutionConfiguration;
rsCfg.FactRetriever = factRetriever;
注
RuleEngineComponentConfiguration コンストラクターの最初のパラメーターとして MyAssembly などの単純なアセンブリ名を指定した場合、BizTalk ルール エンジンはプライベート アセンブリであると見なし、アプリケーション フォルダー内のアセンブリを検索します。 MyAssembly、Version=1.0.0.0、Culture=neutral、PublicKeyToken=a310908b42c024fe などの完全修飾アセンブリ名を指定した場合、ルール エンジンは共有アセンブリであると見なし、グローバル アセンブリ キャッシュ (GAC) 内のアセンブリを検索します。 単純なアセンブリ名と完全修飾アセンブリ名の定義は、 https://go.microsoft.com/fwlink/?LinkId=64535にあります。
必要なデータ ソースに接続し、長期的なファクトとしてエンジンにデータをアサートし、長期的なファクトの新しいインスタンスをエンジンに更新またはアサートするためのロジックを指定するために、必要なアプリケーション固有のロジックを使用してファクト取得機能を設計できます。 更新されるまで、最初にエンジンにアサートされ、その結果キャッシュされる値は、後続の実行サイクルで使用されます。 ファクト取得機能の実装では、トークンに似たオブジェクトが返され、 factsHandleIn オブジェクトと共に使用して、既存のファクトを更新するか、新しいファクトをアサートするかを判断できます。 ポリシーバージョンがそのファクトレトリバーを初めて呼び出す際、factsHandleIn オブジェクトは常に null であり、ファクトレトリバーの実行が完了すると戻りオブジェクトの値を受け取ります。
同じルール エンジン インスタンスの場合、長期的なファクトは 1 回だけアサートする必要があることに注意してください。 たとえば、オーケストレーションで [呼び出し規則 ] 図形を使用すると、ポリシー インスタンスは内部キャッシュに移動されます。 現時点では、すべての短期的な事実が取り消され、長期的な事実が保持されます。 同じオーケストレーション インスタンスまたは同じホスト内の別のオーケストレーション インスタンスによって同じポリシーが再度呼び出された場合、このポリシー インスタンスはキャッシュからフェッチされ、再利用されます。 一部のバッチ処理シナリオでは、同じポリシーの複数のポリシー インスタンスを作成できます。 新しいポリシー インスタンスが作成された場合は、正しい長期的なファクトがアサートされていることを確認する必要があります。
さらに、次の戦略を実装するためのカスタム コードを記述する必要があります。
長期的な事実を更新するタイミングを把握する
どのルール エンジン インスタンスがどの長期的なファクトを使用しているかを追跡する
次のサンプル コードは、さまざまなバインディングの種類を使用して、MyTableInstance を長期的なファクトとしてアサートするために MyPolicy に関連付けられているさまざまなファクト取得機能の実装を示しています。
DataTable バインド
using System;
using System.Xml;
using System.Collections;
using Microsoft.RuleEngine;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace MyBizTalkApplication.FactRetriever
{
public class myFactRetriever:IFactRetriever
{
public object UpdateFacts(RuleSetInfo rulesetInfo, Microsoft.RuleEngine.RuleEngine engine, object factsHandleIn)
{
object factsHandleOut;
if (factsHandleIn == null)
{
SqlDataAdapter dAdapt = new SqlDataAdapter();
dAdapt.TableMappings.Add("Table", "CustInfo");
SqlConnection conn = new SqlConnection("Initial Catalog=Northwind;Data Source=(local);Integrated Security=SSPI;");
conn.Open();
SqlCommand myCommand = new SqlCommand("SELECT * FROM CustInfo", conn);
myCommand.CommandType = CommandType.Text;
dAdapt.SelectCommand = myCommand;
DataSet ds = new DataSet("Northwind");
dAdapt.Fill(ds);
TypedDataTable tdt = new TypedDataTable(ds.Tables["CustInfo"]);
engine.Assert(tdt);
factsHandleOut = tdt;
}
else
factsHandleOut = factsHandleIn;
return factsHandleOut;
}
}
}
DataRow バインド
using System;
using System.Xml;
using System.Collections;
using Microsoft.RuleEngine;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace MyBizTalkApplication.FactRetriever
{
public class myFactRetriever:IFactRetriever
{
public object UpdateFacts(RuleSetInfo rulesetInfo, Microsoft.RuleEngine.RuleEngine engine, object factsHandleIn)
{
object factsHandleOut;
if (factsHandleIn == null)
{
SqlDataAdapter dAdapt = new SqlDataAdapter();
dAdapt.TableMappings.Add("Table", "CustInfo");
SqlConnection conn = new SqlConnection("Initial Catalog=Northwind;Data Source=(local);Integrated Security=SSPI;");
conn.Open();
SqlCommand myCommand = new SqlCommand("SELECT * FROM CustInfo", conn);
myCommand.CommandType = CommandType.Text;
dAdapt.SelectCommand = myCommand;
DataSet ds = new DataSet("Northwind");
dAdapt.Fill(ds);
TypedDataTable tdt = new TypedDataTable(ds.Tables["CustInfo"]);
// binding to the first row of CustInfo table
TypedDataRow tdr = new TypedDataRow(ds.Tables["CustInfo"].Rows[0],tdt);
engine.Assert(tdr);
factsHandleOut = tdr;
}
else
factsHandleOut = factsHandleIn;
return factsHandleOut;
}
}
}
次のサンプル コードは、ファクト取得機能の実装で .NET ファクトと XML ファクトをアサートする方法を示しています。
using System;
using System.Xml;
using System.Collections;
using Microsoft.RuleEngine;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace MyBizTalkApplication.FactRetriever
{
public class myFactRetriever:IFactRetriever
{
public object UpdateFacts(RuleSetInfo rulesetInfo, Microsoft.RuleEngine.RuleEngine engine, object factsHandleIn)
{
object factsHandleOut;
if (factsHandleIn == null)
{
//create .NET object instances
bookInstance = new Book();
magazineInstance = new Magazine();
//create an instance of the XML object
XmlDocument xd = new XmlDocument();
//load the document
xd.Load(@"..\myXMLInstance.xml");
//create and instantiate an instance of TXD
TypedXmlDocument doc = new TypedXmlDocument("mySchema",xd1);
engine.Assert(bookInstance);
engine.Assert(magazineInstance);
engine.Assert(doc);
factsHandleOut = doc;
}
else
factsHandleOut = factsHandleIn;
return factsHandleOut;
}
}
}
DataConnection バインディング
using System;
using System.Xml;
using System.Collections;
using Microsoft.RuleEngine;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace MyBizTalkApplication.FactRetriever
{
public class myFactRetriever:IFactRetriever
{
public object UpdateFacts(RuleSetInfo rulesetInfo, Microsoft.RuleEngine.RuleEngine engine, object factsHandleIn)
{
object factsHandleOut;
{
string strCmd = "Initial Catalog=Northwind;Data Source=(local);Integrated Security=SSPI;";
SqlConnection conn = new SqlConnection(strCmd);
DataConnection dc = new DataConnection("Northwind", "CustInfo", conn);
engine.Assert(dc);
factsHandleOut = dc;
}
return factsHandleOut;
}
}
}
DataConnectionは、前のコード サンプルに示すように、ファクトレトリバーから提供された場合は常に再アサートする必要があることに注意してください。 エンジン インスタンスは DataConnection を使用して、ルールの条件に基づいてデータベースにクエリを実行します。クエリによって返されるすべての行は、 TypedDataRowとしてエンジンの作業メモリにアサートされます。 DataConnection を再アサートすると、エンジンの以前の実行の行がメモリからクリアされます。
実際には、データ ソースを外部化する方法を提供する点を除き、ファクト レトリバーを介して DataConnection をアサートする利点はほとんどありません。