Bagikan melalui


Cara Membuat Fact Retriever

Fact retriever adalah komponen yang digunakan untuk menegaskan instans fakta jangka panjang ke dalam kebijakan selama eksekusinya. Anda dapat menerapkan antarmuka IFactRetriever dan mengonfigurasi versi kebijakan untuk menggunakan implementasi ini pada durasi untuk membawa instans fakta jangka panjang. Versi kebijakan memanggil metode UpdateFacts dari implementasi fact retriever pada setiap siklus eksekusi, jika pengambilan fakta dikonfigurasi untuk versi tertentu tersebut.

Anda dapat secara opsional mengimplementasikan antarmuka IFactRemover pada komponen fact retriever. Mesin aturan memanggil metode UpdateFactsAfterExecution dari antarmuka IFactRemover saat kebijakan dibuang. Ini memberikan kesempatan bagi Anda untuk melakukan pekerjaan pasca-eksekusi seperti melakukan perubahan database apa pun atau mencabut instans objek apa pun dari memori kerja mesin aturan.

Untuk menentukan fact retriever untuk kebijakan

Anda dapat menggunakan kode berikut untuk mengonfigurasi seperangkat aturan untuk menggunakan kelas bernama "Retriever" di rakitan bernama "MyAssembly" sebagai pengambilan fakta.

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;

Catatan

Jika Anda menentukan nama rakitan sederhana seperti MyAssembly sebagai parameter pertama untuk konstruktor RuleEngineComponentConfiguration, mesin aturan BizTalk mengasumsikan bahwa itu adalah perakitan privat dan mencari perakitan di folder aplikasi Anda. Jika Anda menentukan nama rakitan yang sepenuhnya memenuhi syarat seperti MyAssembly, Version=1.0.0.0, Culture=netral, PublicKeyToken=a310908b42c024fe, mesin aturan mengasumsikan bahwa itu adalah rakitan bersama dan mencari perakitan dalam cache rakitan global (GAC). Anda dapat menemukan definisi nama assembly sederhana dan sepenuhnya memenuhi syarat di https://go.microsoft.com/fwlink/?LinkId=64535.

Anda dapat merancang fact retriever dengan logika khusus aplikasi yang diperlukan untuk terhubung ke sumber data yang diperlukan, menegaskan data sebagai fakta jangka panjang ke dalam mesin, dan menentukan logika untuk menyegarkan atau menegaskan instans baru dari fakta jangka panjang ke dalam mesin. Hingga diperbarui, nilai yang awalnya ditegaskan ke dalam mesin dan akibatnya di-cache akan digunakan pada siklus eksekusi berikutnya. Implementasi fact retriever mengembalikan objek yang dianalogikan dengan token dan dapat digunakan bersama dengan objek factsHandleIn untuk menentukan apakah akan memperbarui fakta yang ada atau menegaskan fakta baru. Ketika versi kebijakan memanggil fact retriever untuk pertama kalinya, objek factsHandleIn selalu null dan kemudian mengambil nilai objek pengembalian setelah eksekusi pengambilan fakta.

Perhatikan bahwa untuk instans mesin aturan yang sama, fakta jangka panjang hanya perlu ditegaskan sekali. Misalnya, saat Anda menggunakan bentuk Aturan Panggilan dalam orkestrasi, instans kebijakan dipindahkan ke cache internal. Saat ini, semua fakta jangka pendek dicabut dan fakta jangka panjang disimpan. Jika kebijakan yang sama dipanggil lagi, baik oleh instans orkestrasi yang sama atau oleh instans orkestrasi yang berbeda di host yang sama, instans kebijakan ini diambil dari cache dan digunakan kembali. Dalam beberapa skenario pemrosesan batch, beberapa instans kebijakan dari kebijakan yang sama dapat dibuat. Jika instans kebijakan baru dibuat, Anda harus memastikan bahwa fakta jangka panjang yang benar dinyatakan.

Selain itu, Anda perlu menulis kode kustom untuk menerapkan strategi berikut:

  • Ketahui kapan harus memperbarui fakta jangka panjang

  • Melacak instans mesin aturan mana yang menggunakan fakta jangka panjang mana

    Kode sampel berikut menunjukkan implementasi fact retriever yang berbeda, yang terkait dengan MyPolicy untuk menegaskan MyTableInstance sebagai fakta jangka panjang, menggunakan jenis pengikatan yang berbeda.

Pengikatan 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;
      }
   }
}

Pengikatan 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;
      }
   }
}

Contoh kode berikut menunjukkan cara menegaskan fakta .NET dan XML dalam implementasi fact retriever.

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;
      }
   }
}

Pengikatan 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;
      }
   }
}

Perhatikan bahwa DataConnectionharus selalu dipertahankan kembali, ketika disediakan dari pengambilan fakta, seperti yang ditunjukkan dalam sampel kode sebelumnya. Instans mesin menggunakan DataConnection untuk mengkueri database berdasarkan kondisi aturan, dan baris apa pun yang dikembalikan oleh kueri akan ditegaskan ke dalam memori kerja mesin sebagai TypedDataRows. Penetapan ulang DataConnection memastikan bahwa baris dari eksekusi mesin sebelumnya dibersihkan dari memori.

Bahkan, ada sedikit keuntungan untuk menegaskan DataConnection melalui pengambilan fakta kecuali bahwa ia menyediakan cara untuk eksternalisasi sumber data.