Retract
可以使用 Retract 函数从业务规则引擎的工作内存中删除对象。 以下各段落介绍了与从规则引擎的工作内存中取消不同类型的实体的操作相关联的行为。
.NET 对象
使用 Retract 函数在策略中收回 .NET 对象。 此函数在业务规则编辑器中作为 函数 词汇项提供:将类 (而不是程序集或方法) 拖动到 Retract 参数中。
注意
如果将某个方法拖动到 Retract 函数中,引擎将尝试收回该方法返回的对象。
取消 .NET 对象将会从规则引擎的工作内存中删除该对象,并且此操作具有以下影响:
在谓词中使用该对象的规则将会从议程中删除其操作(如果在议程中存在任何操作)。
从议程中删除使用这些对象的操作。
注意
在调用 Retract 函数之前,可能已经执行了议程上其他操作。
引擎不再评估该对象。
TypedXmlDocument
可以收回已断言到引擎中的原始 TypedXmlDocument,也可以收回从父 XmlDocument节点创建的子 TypedXmlDocument 之一。
以以下 XML 为例,可以收回与 order 关联的 TypedXmlDocument ,或者收回与 orderline 关联的 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 相关联。 例如, product 是 orderline 对象下面的 TypedXmlDocument ;因此,它将与 TypedXmlDocument 的顺序相关联,而不是与顺序行 TypedXmlDocument 相关联。 在大多情况下,此差别并不重要。 但是,如果取消订单对象,则也将取消订单行和产品对象。 如果取消订单行对象,则仅取消该对象,而不会取消产品对象。
该引擎仅处理和跟踪对象实例 (TypedXmlDocument在最初断言 TypedXmlDocument 时创建的) 。 如果创建其他节点(例如,将同级节点添加到通过策略中的选择器选择的节点),则不会在规则中评估这些节点,除非为其创建并断言 TypedXmlDocument。 断言这些新的较低级别的 TypedXmlDocuments 会导致它们在规则中进行评估,但顶级 TypedXmlDocument 不了解它们。 收回顶级 TypedXmlDocument 时,不会自动收回新的独立断言 TypedXmlDocuments。 因此,如果创建新节点,通常最简单的方法就是收回并重新确认完整的 XmlDocument。
TypedXmlDocument 类支持许多有用的方法,这些方法可作为操作的一部分在自定义 .NET 成员中调用。 其中包括获取与 TypedXmlDocument 或父 TypedXmlDocument 关联的 XmlNode 的功能。
TypedDataTable
可以收回单个 TypedDataRow或整个 TypedDataTable。 如果取消表,则将从工作内存中取消所包含的所有行。
若要收回整个 TypedDataTable,需要使用帮助程序函数访问 TypedDataRow 上的 Parent 属性,例如:
Retract(MyHelper.GetTypedDataTable(TypedDataRow))
在前面的操作中,将表拖动到 TypedDataRow 中。 在 GetTypedDataTable 中,将返回 TypedDataRow.Parent 的值。
与 TypedXmlDocument一样,如果在断言 TypedDataTable后为同一 数据表 断言其他新的 TypedDataRow,它们将被视为单个实体,而收回 TypedDataTable 不会导致这些额外的 TypedDataRow的收回。 仅收回 在断言时 TypedDataTable 中包含的 TypedDataRow 。
DataConnection
收回 DataConnection 时,将通过 DataConnection 构造的查询从数据库检索到的所有 TypedDataRow将从工作内存中收回。 DataConnection 本身也会被收回,这意味着不会再通过 DataConnection (即,通过在) 的其他谓词或操作中使用 DataConnection 来检索更多的 TypedDataRow。
使用 DataConnection 时,对单个 TypedDataRow 执行的任何收回操作都会使引擎处于不一致状态。 因此,不允许对与 DataConnection 关联的单个 TypedDataRow执行操作。 如果使用 DataConnection 参数) 将表拖动到 Retract 函数 (,则将收回 DataConnection。