Condividi tramite


Come creare una funzione recupero fact

Una funzione recupero fact è un componente che viene utilizzato per dichiarare istanze di fact a lungo termine in un criterio durante la relativa esecuzione. È possibile implementare l'interfaccia IFactRetriever e configurare una versione dei criteri per usare questa implementazione in fase di esecuzione per inserire le istanze dei fatti a lungo termine. La versione dei criteri richiama il metodo UpdateFacts dell'implementazione del recupero dei fatti in ogni ciclo di esecuzione, se un recuperatore di fatti è configurato per tale versione specifica.

Facoltativamente, è possibile implementare l'interfaccia IFactRemover in un componente di recupero dei fatti. Il motore di regole richiama il metodo UpdateFactsAfterExecution dell'interfaccia IFactRemover quando il criterio viene eliminato. Questo consente di eseguire eventuali operazioni successive all'esecuzione, quali ad esempio il commit delle modifiche apportate al database o la ritrazione di istanze di oggetti dalla memoria di lavoro del Motore regole di business.

Per specificare una funzione recupero fact per un criterio

È possibile utilizzare il codice seguente per configurare il set di regole per l'utilizzo di una classe denominata "Retriever" nell'assembly "MyAssembly" come funzione recupero fact.

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;

Nota

Se si specifica un nome di assembly semplice come MyAssembly come primo parametro del costruttore RuleEngineComponentConfiguration, il Motore regole di business BizTalk presuppone che si tratti di un assembly privato ed esegue una ricerca dell'assembly nella cartella dell'applicazione. Se si specifica il nome dell'assembly completo, ad esempio MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a310908b42c024fe, il motore delle regole presuppone che sia un assembly condiviso e cerca l'assembly nella global assembly cache (GAC). È possibile trovare le definizioni di nomi di assembly semplici e completi in https://go.microsoft.com/fwlink/?LinkId=64535.

È possibile progettare la funzione recupero fact con la logica specifica dell'applicazione necessaria per stabilire una connessione alle origini dati necessarie, dichiarare i dati come fact a lungo termine nel motore e specificare la logica per l'aggiornamento o la dichiarazione di nuove istanze dei fact a lungo termine nel motore. Fino a quando non vengono aggiornati, i valori inizialmente dichiarati nel motore e successivamente memorizzati nella cache verranno utilizzati nei successivi cicli di esecuzione. L'implementazione del recupero dei fatti restituisce un oggetto analogo a un token e può essere usato insieme all'oggetto factHandleIn per determinare se aggiornare i fatti esistenti o affermare nuovi fatti. Quando una versione di criteri chiama il recupero dei fatti per la prima volta, l'oggetto factHandleIn è sempre Null e quindi accetta il valore dell'oggetto restituito dopo l'esecuzione del recupero dei fatti.

Tenere presente che per la stessa istanza del Motore regole di business è necessario dichiarare un fact a lungo termine una sola volta. Ad esempio, quando si usa la forma Regole di chiamata in un'orchestrazione, l'istanza dei criteri viene spostata in una cache interna. A questo punto, tutti i fact a breve termine vengono ritratti e i fact a lungo termine vengono conservati. Se lo stesso criterio viene chiamato di nuovo, dalla stessa istanza di orchestrazione o da un'istanza di orchestrazione differente nello stesso host, l'istanza di questo criterio verrà recuperata dalla cache e riutilizzata. In alcuni scenari di elaborazione batch è possibile creare diverse istanze dello stesso criterio. Se viene creata una nuova istanza di un criterio, è necessario assicurarsi che vengano dichiarati i fact a lungo termine corretti.

È necessario inoltre scrivere codice personalizzato per implementare le seguenti strategie:

  • Sapere quando aggiornare i fact a lungo termine.

  • Tenere traccia delle istanze del Motore regole di business che utilizzano fact a lungo termine.

    Nel codice di esempio seguente vengono illustrate diverse implementazioni della funzione recupero fact, che vengono associate a MyPolicy per dichiarare MyTableInstance come fact a lungo termine mediante diversi tipi di binding.

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

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

Nell'esempio di codice seguente viene illustrato come dichiarare i fact .NET e XML in un'implementazione di una funzione recupero fact.

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

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

Si noti che DataConnections deve essere sempre riassestato, se fornito da un recuperatore di fatti, come illustrato nell'esempio di codice precedente. L'istanza del motore usa DataConnection per eseguire query sul database in base alle condizioni della regola e tutte le righe restituite dalla query verranno asserte nella memoria di lavoro del motore come TypedDataRows. La riassettazione di DataConnection garantisce che le righe di un'esecuzione precedente del motore vengano cancellate dalla memoria.

In effetti, esiste un piccolo vantaggio per affermare un DataConnection tramite un recuperatore dei fatti, ad eccezione del fatto che offre un modo per esternare l'origine dati.