다음을 통해 공유


팩트 검색기를 만드는 방법

팩트 검색기는 정책을 실행하는 동안 장기 팩트 인스턴스를 정책으로 어셜션하는 데 사용되는 구성 요소입니다. 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이며 팩트 검색기가 실행된 후 반환 개체의 값을 사용합니다.

동일한 규칙 엔진 인스턴스의 경우 장기 팩트를 한 번만 어설션하면 됩니다. 예를 들어 오케스트레이션에서 호출 규칙 셰이프를 사용하면 정책 instance 내부 캐시로 이동됩니다. 이때 모든 단기 팩트는 취소되고 장기 팩트만 보관됩니다. 동일한 오케스트레이션 호스트나 동일한 호스트 내의 다른 오케스트레이션 인스턴스로 동일한 정책을 다시 호출하는 경우 캐시에서 이 정책 인스턴스를 가져와 다시 사용합니다. 일부 일괄 처리 시나리오에서는 동일한 정책에 대해 여러 개의 정책 인스턴스를 만들 수 있습니다. 새 정책 인스턴스를 만들면 정확한 장기 팩트를 어설션해야만 합니다.

또한 다음 전략을 구현하는 사용자 지정 코드를 작성해야 할 수 있습니다.

  • 장기 팩트의 업데이트 시기 파악

  • 어떤 규칙 엔진이 어떤 장기 팩트를 사용하는지 추적

    다음 샘플 코드는 다양한 팩트 검색기 구현을 보여 줍니다. 이 구현은 다양한 바인딩 유형을 사용하여 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는 항상 다시 확인되어야 합니다. 엔진 instance DataConnection을 사용하여 규칙 조건에 따라 데이터베이스를 쿼리하고 쿼리에서 반환된 모든 행은 엔진의 작업 메모리에 TypedDataRows로 어설션됩니다. DataConnection을 다시 확인하면 엔진의 이전 실행에서 행이 메모리에서 지워집니다.

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