可以使用 Retract 函数从业务规则引擎的工作内存中删除对象。 以下段落描述了与从规则引擎的工作内存中收回不同类型的实体相关的行为。
.NET 对象
使用 Retract 函数在策略中收回 .NET 对象。 此函数在业务规则编辑器中作为 Functions 词汇项提供:将类(而不是程序集或方法)拖动到 Retract 参数中。
注释
如果将方法拖至 Retract 函数中,则引擎将尝试取消该方法所返回的对象。
收回 .NET 对象会将其从规则引擎的工作内存中删除,并具有以下影响:
使用谓词对象的规则将其动作从议程中移除(如果议程上存在)。
从议程中删除使用这些对象的操作。
注释
在调用 Retract 函数之前,议程上的其他作可能已经执行。
该对象不再由引擎计算。
TypedXmlDocument
可以收回在引擎中断言的原始 TypedXmlDocument,也可以收回从父 XmlDocument 的节点创建的其中一个子 TypedXmlDocument。
使用下面的 XML 作为示例,可以撤销与订单关联的 TypedXmlDocument,或者撤销与订单项关联的一个或两个 TypedXmlDocument。
<order>
<orderline customer="Joe" linenumber="001">
<product name="router" quantity="10" cost="550" />
</orderline>
<orderline customer="Jane" linenumber="002">
<product name="switch" quantity="1" cost="300" />
</orderline>
</order>
若要收回顺序对象,可以在 XML 架构事实窗格中拖动架构的顶部节点。 此节点以“.xsd”结尾,表示文档根节点(而不是文档元素节点):它具有一个引用初始 TypedXmlDocument 的“/”选择器。 收回父 TypedXmlDocument 时,将从工作内存中删除与 TypedXmlDocument 关联的所有 TypedXmlDocument 实例(通过调用基于策略中使用的选择器调用 Assert 函数创建的所有 TypedXmlDocument实例)。
若要仅撤回单个子 TypedXmlDocument(即订单线),可以将该节点从 XML 架构窗格拖动到 Retract 函数中。 请务必注意,所有 TypedXmlDocument都与最初断言的顶级 TypedXmlDocument 相关联,而不是与 XML 树层次结构中其上方显示的 TypedXmlDocument 相关联。 例如,产品是 orderline 对象下面的 TypedXmlDocument;因此,它将与 order TypedXmlDocument 相关联,而不是与 orderline TypedXmlDocument 相关联。 在大多数情况下,这种区别并不重要。 但是,如果收回订单对象,则订单线和产品对象也会收回。 如果收回订单线对象,则只收回该对象,而不是产品对象。
引擎仅适用于并跟踪其在最初断言TypedXmlDocument时创建的对象实例(TypedXmlDocuments)。 如果您创建了其他节点——例如,通过策略的选择器选择出来的节点的同级节点——那么这些节点不会在规则中进行评估,除非为它们创建并确认TypedXmlDocument。 断言这些新的较低级别的 TypedXmlDocuments 会导致它们在规则中被评估,但顶层 TypedXmlDocument 对它们不了解。 当收回顶级 TypedXmlDocument 时,新的、独立断言的 TypedXmlDocument 不会被自动收回。 因此,如果创建了新节点,通常最直接地撤销并重新确认完整的 XmlDocument。
TypedXmlDocument 类支持许多有用的方法,这些方法可以在自定义 .NET 成员中作为作的一部分调用。 其中包括获取与 TypedXmlDocument 或父 TypedXmlDocument 关联的 XmlNode 的功能。
类型化数据表
可以收回单个TypedDataRow或整个TypedDataTable。 如果撤回数据表,则内存中所有包含的行也将被撤回。
若要收回整个 TypedDataTable,需要使用帮助程序函数访问 TypedDataRow 上的 Parent 属性,例如:
Retract(MyHelper.GetTypedDataTable(TypedDataRow))
在前面的作中,将表拖到 TypedDataRow 中。 在 GetTypedDataTable 中,将返回 TypedDataRow.Parent 的值。
与 TypedXmlDocuments 一样,如果在断言 TypedDataTable 后为同一 DataTable 断言了新的 TypedDataRow,则它们被视为单个实体,并且收回 TypedDataTable 不会导致这些额外的 TypedDataRow的收回。 仅当被断言时, TypedDataTable中包含的 TypedDataRow s 才会被收回。
DataConnection
撤回 DataConnection 时,所有通过 DataConnection 构造的查询从数据库中检索到的 TypedDataRow都会从工作内存中移除。 DataConnection 本身也会收回,这意味着不会再通过 DataConnection 检索 TypedDataRow(即,通过在其他谓词或动作中使用 DataConnection)。
使用 DataConnection 时,对单个 TypedDataRow 进行任何收回操作都会导致引擎处于不一致的状态。 因此,不允许对与 DataConnection 关联的单个 TypedDataRow 执行操作。 如果将表(使用 DataConnection 参数)拖动到 Retract 函数中,则会收回 DataConnection。