共用方式為


使用 Microsoft Rules Composer 對規則集執行進階工作 (預覽)

適用於:Azure Logic Apps (標準)

重要

此功能處於預覽狀態,且受限於 Microsoft Azure 預覽版的補充使用規定

本指南說明您可以在 Microsoft Rules Composer 中對規則集執行的更進階作業。

必要條件

複製規則集版本

您可以建立現有規則集版本的複本,但版本號碼不同。

  1. 開啟Microsoft規則編輯器。 在 [RuleSet Explorer] 視窗中,開啟規則集版本的快捷方式功能表,然後選取 [ 複製]。

  2. 開啟規則集的快捷方式功能表,然後選取 [ 貼上 RuleSet 版本]。

    Microsoft Rules Composer 會建立新的規則集版本,其元素與複製的版本相同,但號碼不同。

    注意

    如果您更新用來提供規則集事實的 .NET 元件,請務必更新規則集版本的該元件參考。 如需詳細資訊,請參閱 更新 .NET 元件參考

建立空的規則集版本

將規則新增至規則集版本之後,您可以建立具有不同號碼的新空白規則集版本,並儲存該版本以供稍後使用。

  1. 開啟Microsoft規則編輯器。 從規則集的快捷方式功能表中,選取 [ 新增版本]。

    Microsoft Rules Composer 會建立具有不同數位的新空白規則集版本。

  2. 開啟新規則集版本的快捷方式功能表,然後選取 [ 儲存]。

您現在可以從其他規則集版本複製規則,並將其貼到新版本。

將事實類型傳遞至規則集

雖然您無法直接指定規則集的傳回類型,但您可以將下列其中一種事實類型傳遞至規則集、讓規則集將事實的值變更為 truefalse,然後在規則集執行之後檢查屬性或專案/數據行的值:

  • 具有型別屬性的 Boolean .NET 物件
  • 具有型別 Boolean 專案的 XML 檔

設定規則集的事實擷取器

當您搭配規則集使用事實擷取器時,可以儲存不常變更的事實,以便在主應用程式第一個執行週期之前進行變更。 如此一來,您就可以從記憶體擷取這些事實、向規則引擎呈現一次快取,並在多個執行週期中重複使用它們。 如需詳細資訊,請參閱 建置事實建立者和擷取程式

您有兩種方式可將事實擷取程式與規則集產生關聯:

  • 在 Microsoft Rules Composer 中手動選取規則集版本的事實擷取器。

  • 以程序設計方式使用 RuleSetExecutionConfiguration 物件。

注意

您只能將一個事實擷取程式實作與規則集版本產生關聯。

手動選取規則集的事實擷取器

  1. 開啟Microsoft規則編輯器。 在 RuleSet Explorer 中,選取您想要與事實擷取器產生關聯的規則集版本。

  2. 在 [屬性] 視窗中,選取 FactRetriever 屬性數據列,然後選取省略號按鈕 (...) 以尋找並選取現有的事實擷取器物件。

    注意

    在您選取 [屬性] 視窗中的 FactRetriever 數據列之前,不會顯示省略號按鈕 (...)。

從父規則集呼叫子規則集

針對這項工作,請使用下列其中一種方法:

  • Ruleset.Execute直接從父規則集呼叫 方法。

  • 從父規則集,呼叫包裝 Ruleset.Execute 方法的 Helper .NET 元件方法。

    使用第二種方法,您可以將前置處理和後處理程式代碼新增至 Ruleset.Execute 方法。 例如,您可以在這個包裝函式方法內,從子規則集建立所需的任何事實。 下列各節提供每個方法的範例。

直接從父規則集呼叫 Ruleset.Execute 方法

本節提供使用 方法,直接從父規則集呼叫子規則集 Ruleset.Execute 的高階步驟。 下列程式顯示將 方法新增 Ruleset.Execute 為動作的步驟,以將 XML 檔當做事實傳遞至子規則集的父規則集。

注意

在此範例案例中,XML 檔會提交為父規則集的事實。 本檔會以事實的形式傳遞至子規則集。 不過,您可以呼叫 .NET 方法,以改為建立子規則集的事實。

  1. 開啟Microsoft規則編輯器。 在 [事實總 管] 視窗中,選取 [.NET 類別] 索引標籤

  2. 開啟 .NET 元件的快捷方式功能表,然後選取 [流覽]。

  3. 從 .NET 元件清單中,選取 [Microsoft.RuleEngine],然後選取 [確定]。

  4. 展開 [規則集],然後將 Execute(Object facts)Execute(Object facts, IRuleSetTrackingInterceptor trackingInterceptor) 拖曳THEN 窗格。

  5. 選取 [XML 架構] 節點,開啟 [架構]快捷方式功能表,然後選取 [瀏覽]。

  6. 選取您想要傳遞為事實的 XML 檔案的架構,然後選取 [ 開啟]。

  7. 若要將傳遞至父規則集做為事實的 XML 檔傳遞至子規則集,請將 schema-name.xsd> 拖曳<至 Ruleset.Execute 方法中的第一個自變數。

  8. 如果您使用不採用 IRuleSetTrackingInterceptor 做為第二個自變數的 Execute 方法,請略過下列步驟。

  9. 選取 [.NET 類別] 索引卷標,然後將 Microsoft.RuleEngine 中的 DebugTrackingInterceptor 拖曳至 Ruleset.Execute 方法的第二個自變數

    注意

    如果您執行此動作,客戶端必須將DebugTrackingInterceptor 類別的實例當做事實傳遞至父規則集,然後將實例當做事實傳遞至子規則集。 相反地,您可以拖曳 DebugTrackingInterceptor 類別的建構函式,以便自動為您建立實例。

修改呼叫父規則集的用戶端應用程式

叫用父規則集的用戶端會建立具有子規則集名稱做為參數的 Ruleset 類別實例,並將該實例當做事實傳遞給父規則集,以及其他事實。 下列範例程式代碼說明此動作:

DebugTrackingInterceptor dti = new DebugTrackingInterceptor("RulesetTracking.txt");
Ruleset Ruleset = new Ruleset("ParentRuleset");
object[] facts = new object[3];
facts[0] = txd;
facts[1] = new Ruleset("ChildRuleset");
facts[2] = new DebugTrackingInterceptor("RulesetTracking2.txt");
Ruleset.Execute(facts, dti);
Ruleset.Dispose();

如果用戶端是 BizTalk 協調流程,您可能需要將程式代碼放在表示式圖形中以建立事實,然後將事實當做參數傳遞至呼叫規則圖形。

從父規則集呼叫 .NET 包裝函式方法

本節提供從父規則集叫用呼叫 Ruleset.Execute 方法的高階步驟。

建立公用程式 .NET 類別

  1. 建立 .NET 類別庫專案。 將類別加入至專案。

  2. 新增靜態方法, Ruleset.Execute 呼叫 方法以叫用名稱傳遞為參數的規則集,例如,如下列範例程式代碼所示:

    public static void Execute(string RulesetName, TypedXmlDocument txd)
    {
        DebugTrackingInterceptor dti = new   DebugTrackingInterceptor("RulesetTracking.txt");
        Ruleset Ruleset = new Ruleset("ParentRuleset");
        object[] facts = new object[3];
        facts[0] = txd;
        facts[1] = new Ruleset("ChildRuleset");
        facts[2] = new DebugTrackingInterceptor("RulesetTracking2.txt");
        Ruleset.Execute(facts, dti);
        Ruleset.Dispose();
    }
    

    用戶端會叫用父規則集,而父規則集會呼叫叫用子規則集的協助程式方法,例如,如用戶端的下列範例程式代碼所示:

    facts[0] = txd;
    facts[1] = new RulesetExecutor(txd);
    
    // Call the first or parent ruleset.
    Ruleset Ruleset = new Ruleset(RulesetName);
    DebugTrackingInterceptor dti = new DebugTrackingInterceptor("RulesetTracking.txt");
    Ruleset.Execute(facts, dti);
    Ruleset.Dispose();
    

    注意

    如果方法是實例方法,客戶端必須建立協助程式 .NET 類別的實例,並將該實例當做事實傳遞至父規則集。

分析規則中具有相同類型的多個物件

在許多情況下,您會針對類型撰寫商務規則,並預期引擎會分別分析和處理判斷提示至引擎的每個類型實例。 不過,在某些情況下,您希望引擎同時分析具有相同類型的多個實例。 例如,下列範例規則使用FamilyMember類別的多個實例:

IF FamilyMember.Role == Father
AND FamilyMember.Role == Son
AND FamilyMember.Surname == FamilyMember.Surname
THEN FamilyMember.AddChild(FamilyMember)

此規則會識別多個 FamilyMember 實例,其中一個是 父親 ,另一個 是Son。 如果實例與姓氏相關,規則會將Son實例新增至Father實例上的子系集合。 如果引擎個別分析每個FamilyMember實例,則規則永遠不會觸發,因為在此案例中,FamilyMember 只有一個角色,即FatherSon

因此,在此案例中,您必須指出引擎會在規則中一起分析多個實例,而且您需要一種方式來區分規則中每個實例的身分識別。 您可以使用 [ 實例識別符 ] 字段來提供這項功能。 當您在 [事實總管] 中選取事實時,即可在 [屬性] 視窗中使用此欄位。

重要

如果您選擇使用 [實例標識符 ] 字段,請務必先變更其值,再將事實或成員拖曳到規則中。

當您使用 [ 實例標識符 ] 字段時,會重建規則。 對於使用FamilyMember類別之Son實例的規則自變數,請將實例標識碼值從預設值0變更為1。 當您將實例標識碼值從 0 變更,並將事實或成員拖曳至規則編輯器時,實例標識符值會出現在類別後面的規則中,例如:

IF FamilyMember.Role == Father
AND FamilyMember(1).Role== Son
AND FamilyMember.Surname == FamilyMember(1).Surname
THEN FamilyMember.AddChild(FamilyMember(1))

現在,假設 將Father 實例和 Son 實例判斷為引擎。 引擎會根據這些實例的各種組合來評估規則。 假設Father和 Son 實例具有相同的姓氏,Son 實例會如預期般新增至 Father 實例。

注意

[ 實例標識符 ] 字段只會用於特定規則評估的內容中。 此欄位不會貼到跨規則集執行的物件實例,而且與判斷提示物件所使用的順序無關。 每個物件實例都會在該類型的所有規則自變數中進行評估。