Compartir a través de

生成与规则和规则集一起使用的事实创建器和检索器(预览版)

适用于:Azure 逻辑应用(标准)

重要

此功能为预览版,受 Azure 预览版补充使用条款约束。

若要为规则引擎创建在业务规则开发和测试期间使用的事实,可以生成一个事实创建器,该创建器将为引擎提供一组 .NET 对象。 还可以生成一个事实检索器,该检索器会将长期或变化缓慢的事实插入规则,以便在执行期间进行评估。

本操作指南演示如何生成供 Azure 逻辑应用规则引擎项目使用的事实创建器和事实检索器。

生成事实创建器

若要创建事实实例,需实现 IFactCreator 接口及其方法 CreateFacts 和 GetFactTypes。 为首个事实创建器生成 .NET 程序集(DLL 文件)后,可以从 Microsoft Rules Composer 的规则集测试功能中选择程序集。 有关详细信息,请参阅测试规则集

以下示例演示事实创建器的实现:

public class MyFactCreator : IFactCreator
{
    private object[] myFacts;
    public MyFactCreator()
    {
    }

    public object[] CreateFacts ( RuleSetInfo rulesetInfo )
    {
        myFacts = new object[1];
        myFacts.SetValue(new MySampleBusinessObject(),0);
        return myFacts;
    }

    public Type[] GetFactTypes (RuleSetInfo rulesetInfo)
    {
       return null;
    }
}

生成事实检索器

事实检索器是一个 .NET 对象,它实现标准方法并通常使用这些方法在规则引擎执行规则集之前,向规则引擎提供长期且变化缓慢的事实。 引擎将缓存这些事实,并在多个执行循环中使用它们。 事实检索器会在第一次提交事实,然后仅在必要时更新内存中的事实。 与其每次调用规则引擎时都提交一个事实,不如创建一个事实检索器,它会在第一次时提交事实,之后仅在必要时在内存中更新该事实。

若要向规则引擎提供事实实例,需实现 IFactRetriever 接口和 UpdateFacts 方法。 然后可以设置规则集版本,以使用此实现在运行时引入事实。 之后,规则集版本会在每个执行周期调用 UpdateFacts 方法。

也可以选择在事实检索器组件上实现 IFactRemover 接口。 然后规则引擎可以在规则集释放时从 IFactRemover 接口调用名为 UpdateFactsAfterExecution 的方法。 这样就可以进行执行后工作,例如提交任何数据库更改或从规则引擎的工作内存取消任何对象实例。

设计事实检索器时可以在其中包含所需的特定于应用程序的逻辑以执行以下任务:

  1. 连接到所需的数据源。

  2. 将数据断言为引擎中的长期事实。

  3. 指定用于将新的长期事实实例刷新或断言到引擎中的逻辑。

    引擎会在后续执行周期中使用最初断言和缓存的值,直到这些值更新。

事实检索器实现将返回一个类似于标记的对象,检索器可将该对象与 factsHandleIn 对象一起使用以确定是否更新现有事实或添加新事实。 当规则集版本首次调用事实检索器时,factsHandleIn 对象始终设置为 null,但在事实检索器完成执行后该对象的值会变为返回对象的值。

以下示例代码演示如何使用事实检索器实现来断言 .NET 和 XML 事实:

using System;
using System.Xml;
using System.Collections;
using Microsoft.Azure.Workflows.RuleEngine;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace MyApplication.FactRetriever
{
    public class myFactRetriever:IFactRetriever
    {
        public object UpdateFacts(RuleSetInfo rulesetInfo, RuleEngine engine, object factsHandleIn)
        {
            object factsHandleOut;
            if (factsHandleIn == null)
            {
                // Create .NET object instances.
                bookInstance = new Book();
                magazineInstance = new Magazine();

                // Create XML object instance.
                XmlDocument xd = new XmlDocument();

                // Load the XML document.
                xd.Load(@"..\myXMLInstance.xml");

                // Create and instantiate a TypedXmlDocument class instance.
                TypedXmlDocument doc = new TypedXmlDocument("mySchema",xd1);

                engine.Assert(bookInstance);
                engine.Assert(magazineInstance);
                engine.Assert(doc);
                factsHandleOut = doc;
            }
            else
                factsHandleOut = factsHandleIn;
                return factsHandleOut;
        }
    }
}

若要包括以下功能,请编写自己的代码实现:

  • 确定何时更新长期事实。

  • 对任何规则引擎实例使用任何长期事实的情况进行跟踪。

为规则集指定事实检索器

若要为所用版本的规则集设置事实检索器,可以在 Microsoft Rules Composer 中设置 Fact Retriever 属性,或编写自己的代码,如以下示例所示,该代码在名为“MyAssembly”的程序集中使用名为“MyFactRetriever”的类:

RuleEngineComponentConfiguration fr = new RuleEngineComponentConfiguration("MyAssembly", "MyFactRetriever");
RuleSet rs = new RuleSet("ruleset");

// Associate the execution configuration with a ruleset version.
RuleSetExecutionConfiguration rsCfg = rs.ExecutionConfiguration;
rsCfg.FactRetriever = factRetriever;

注意

如果使用简单的泛型程序集名称(如“MyAssembly”)作为 RuleEngineComponentConfiguration 构造函数的第一个参数,规则引擎会在应用程序文件夹中查找该程序集。