Assert

断言 是将对象实例添加到业务规则引擎的工作内存的过程。 引擎根据针对实例类型编写的条件和操作,使用匹配-冲突解决-操作阶段来处理每个实例。

以下主题介绍对不同事实类型使用 Assert 函数导致的行为。

.NET 对象

每个对象作为单独的实例添加到工作内存中。 这意味着实例由每个引用对象类型的谓词进行分析(例如,IF Object.Property = 1)。 它还可用于引用类型的规则操作(取决于规则条件的结果)。

请看下面的示例。

规则 1

IF A.Value = 1  
THEN A.Status = "good"  

规则 2

IF B.Value = 1  
THEN A.Status = "good"  

在规则 1 中,只有值为 1 的 A 实例才会更新其 Status 属性。 但是,在规则 2 中,如果条件的计算结果为 true,则 A 的所有实例的状态都将更新。 事实上,如果有多个 B 实例,则每次 B 实例的条件计算结果为 true 时,A 实例都会更新。

若要从规则内断言 .NET 对象,可以将内置 Assert 函数添加为规则操作。 请注意,规则引擎具有 CreateObject 函数,但它不会在业务规则编辑器中显示为单独的函数。 通过将要创建的对象的构造函数方法从事实浏览器的 .NET 类视图拖动到操作窗格,可以生成对该函数的调用。 然后,业务规则编辑器将构造函数方法转换为规则定义中的 CreateObject 调用。

TypedXmlDocument

断言 TypedXmlDocument 时,业务规则引擎会基于规则中定义的选择器创建子 TypedXmlDocument 实例。

选择器和字段都是 XPath 表达式。 您可以将选择器视为隔离 XML 文档的节点的方法,将字段视为标识选择器中的特定项的方法。 一个选择器中的所有字段按引擎分组为一个对象。 在事实资源管理器的“ XML 架构 ”选项卡下选择节点时,业务规则编辑器会自动填充所有节点的 XPath 选择器 属性,并为不包含子节点的任何节点填充 XPath Field 属性。 或者,可以根据需要为 XPath 选择器和 XPath 字段输入自己的 XPath 表达式。

如果选择器与 XML 文档的多个部分相匹配,则将向规则引擎工作内存中添加或从中取消多个此类型的对象。 假定存在以下 XML:

<root>  
   <order customer="Joe">  
      <item name="router" quantity="10" cost="550" />  
      <item name="switch" quantity="3" cost="300" />  
   </order>  
   <order customer="Jane">  
      <item name="switch" quantity="1" cost="300" />  
      <item name="cable" quantity="23" cost="9.99" />  
   </order>  
</root>  

如果使用选择器 /root/order(或 //order),则将向工作内存添加两个对象。

1)

<order customer="Joe">  
   <item name="router" quantity="10" cost="550" />  
   <item name="switch" quantity="3" cost="300" />  
</order>  

2)

<order customer="Jane">  
   <item name="switch" quantity="1" cost="300" />  
   <item name="cable" quantity="23" cost="9.99" />  
</order>  

在每个选择器中,各个字段通过 XPaths 进行引用。

如果使用选择器 /root/order/item (或 (//order/item 或 //item) ,则会将四个对象添加到规则引擎工作内存中,即 Joe 的两个项和 Jane 的两个项。

<root>  
   <order customer="Joe">  
  
   </order>  
   <order customer="Jane">  
  
   </order>  
</root>  

每个对象都有权访问三个字段- @name、 @quantity和 @cost。 由于对象是对原始文档的引用,因此,您可以引用父字段(例如,“../@customer”)。

您可以在同一文档中使用多个选择器。 这样您就可以查看文档的不同部分(例如,如果一个部分为订单,而另一个部分包含发货地址)。 但请记住,所创建的对象是由创建它们的 XPath 字符串定义的。 使用不同的 XPath 表达式,即使它解析为同一节点,也会生成唯一 的 TypedXmlDocument

规则引擎本身支持基本 .NET 标量类型以及引用类型的对象。 XML 文档基本上都是文本,但根据在构造规则时指定的类型,字段值可以是任何类型。 同时,由于字段是 XPath 表达式,因此它们可能会返回节点集。在这种情况下,将使用集合中的第一项作为值。

在后台,规则引擎可以通过 XmlConvert 函数将文本字段值转换为任一受支持的类型。 可以通过在业务规则编辑器中设置类型来指定该功能。 如果无法进行转换,则将会引发异常。 booldouble 类型只能作为各自的类型、字符串或对象进行检索。

TypedDataTable

断言 TypedDataTable 时, DataTable 中包含的所有 DataRow 将自动作为 TypedDataRows 断言到引擎中。 每当表或表列用作规则参数时,表达式将针对单个 TypedDataRows 而不是 TypedDataTable 求值。

例如,假设您针对“Customers”表构建了以下规则:

IF Northwind.Customers.CustomerID = 001  
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"  

注意

若要针对数据库表生成规则,必须使用 “数据表/行 ”作为数据库绑定类型。

假设将以下 DataTable 断言,其中三个 DataRows 作为 TypedDataTable) 引擎 (。

CustomerID ContactTitle
001 Supply Clerk
002 Supply Clerk
003 Supply Clerk

引擎插入三个 TypedDataRows:001、002 和 003。

每个 TypedDataRow 都根据规则独立评估。 第一个 TypedDataRow 满足规则条件,第二个失败。 结果如下所示:

CustomerID ContactTitle
001 采购经理
002 Supply Clerk
003 Supply Clerk

注意

TypedDataRow 也可以直接添加引擎中。 其处理方式与前面所述的方式相同。

DataSetName.DataTableName 被视为唯一标识符。 因此,如果第二个 TypedDataTable 断言具有相同 的 DataSet 名称和 DataTable 名称,它将取代第一个 TypedDataTable。 将收回与第一个 TypedDataTable关联的所有 TypedDataRow ,并断言第二个 TypedDataTable

DataConnection

TypedDataTable 一样,在业务规则编辑器中将表或列作为规则参数拖动会导致根据返回的 TypedDataRow生成规则,而不是 DataConnection 本身。

假设已创建以下规则,并断言一个 DataConnection ,其中包含一个 SqlConnection to Northwind.Customers:

IF Northwind.Customers.CustomerID = 001  
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"  

当引擎评估 TypedDataTable 节中使用的规则时,它会动态生成如下所示的查询:

SELECT *  
FROM Northwind.Customers  
WHERE CustomerID = 1  

由于数据库中只有一行符合此条件,因此只有一个 TypedDataRow 创建并断言到引擎中以供进一步处理。

添加的实体和实例类型摘要

下表概括列出了各种类型的添加行为,显示了在引擎中为添加的每个实体创建的结果实例数,以及应用于这些实例以便对其进行标识的类型。

实体 添加的实例数 实例类型
.NET 对象 1 个(对象本身) 完全限定的 .NET 类
TypedXmlDocument 1-N 个 TypedXmlDocument:基于所创建的选择器绑定和文档内容 DocumentType.Selector
TypedDataTable 1-N 个 TypedDataRow:

DataTable 中的每个 DataRow 各一个
DataSetName.DataTableName
TypedDataRow 1 个(添加的 TypedDataRow) DataSetName.DataTableName
DataConnection 1-N 个(通过查询 DataConnection 返回的每个 TypedDataRow 各一个) DataSetName.DataTableName

另请参阅

引擎控制函数