다음을 통해 공유


Fact Retriever를 만드는 방법

팩트 검색기는 실행 중에 장기 팩트의 인스턴스를 정책에 어설션하는 데 사용되는 구성 요소입니다. 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;

비고

MyAssembly와 같은 단순 어셈블리 이름을 RuleEngineComponentConfiguration 생성자의 첫 번째 매개 변수로 지정하면 BizTalk 규칙 엔진은 프라이빗 어셈블리라고 가정하고 애플리케이션 폴더에서 어셈블리를 찾습니다. MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a310908b42c024fe와 같은 정규화된 어셈블리 이름을 지정하는 경우 규칙 엔진은 공유 어셈블리라고 가정하고 GAC(전역 어셈블리 캐시)에서 어셈블리를 찾습니다. 단순하고 정규화된 어셈블리 이름의 정의를 https://go.microsoft.com/fwlink/?LinkId=64535에서 찾을 수 있습니다.

필요한 데이터 원본에 연결하고, 데이터를 엔진에 장기 팩트로 어설션하고, 엔진에 장기 팩트의 새 인스턴스를 새로 고침하거나 어설션하는 논리를 지정하는 데 필요한 애플리케이션별 논리를 사용하여 팩트 검색기를 디자인할 수 있습니다. 업데이트될 때까지 엔진에 처음에 어설션되고 결과적으로 캐시된 값은 후속 실행 주기에서 사용됩니다. 팩트 검색기 구현은 토큰과 유사하며 factsHandleIn 개체와 함께 사용하여 기존 사실을 업데이트할지 또는 새 사실을 어설션할지 여부를 결정할 수 있는 개체를 반환합니다. 정책 버전이 처음으로 팩트 리트리버를 호출하는 경우 factsHandleIn 개체는 항상 null인 다음 팩트 검색기가 실행된 후 반환 개체의 값을 사용합니다.

동일한 규칙 엔진 인스턴스의 경우 장기 팩트를 한 번만 어설션하면 됩니다. 예를 들어 오케스트레이션에서 호출 규칙 셰이프를 사용하면 정책 인스턴스가 내부 캐시로 이동됩니다. 이 시점에서 모든 단기 사실은 철회되고 장기적인 사실은 유지됩니다. 동일한 오케스트레이션 인스턴스 또는 동일한 호스트의 다른 오케스트레이션 인스턴스에 의해 동일한 정책이 다시 호출되는 경우 이 정책 인스턴스는 캐시에서 가져오고 다시 사용됩니다. 일부 일괄 처리 시나리오에서는 동일한 정책의 여러 정책 인스턴스를 만들 수 있습니다. 새 정책 인스턴스가 만들어지면 올바른 장기 팩트를 어설션해야 합니다.

또한 다음 전략을 구현하기 위해 사용자 지정 코드를 작성해야 합니다.

  • 장기 팩트를 업데이트해야 하는 경우 파악

  • 어떤 규칙 엔진 인스턴스가 어떤 장기 팩트를 사용하는지 추적합니다.

    다음 샘플 코드는 다른 바인딩 형식을 사용하여 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;
      }
   }
}

앞의 코드 샘플과 같이 팩트 검색기에서 제공된 경우 DataConnections는 항상 재주장되어야 합니다. 엔진 인스턴스는 DataConnection 을 사용하여 규칙 조건에 따라 데이터베이스를 쿼리하고 쿼리에서 반환된 모든 행은 엔진의 작업 메모리에 TypedDataRows로 어설션됩니다. DataConnection을 재설정하면 엔진의 이전 실행에서 메모리에 있는 행이 지워집니다.

사실 데이터 원본을 외부화하는 방법을 제공한다는 점을 제외하고는 팩트 검색기를 통해 DataConnection 을 어설션하는 데는 거의 이점이 없습니다.