1

我是 BRE 的新手,对 BizTalk 整体来说还很陌生,所以这可能很简单,只是在逃避我......

我想做的是:在 BRE 中创建一个业务规则,将传入消息作为输入,并检查消息中包含的值是否与指定值集中的任何值匹配。示例消息如下。<isFound>然后将相应地更新该字段。

<n1:DocumentTemplate xmlns:n1="mynamespace">
    <rootOid>2.16.840.1.113883.3.51.60.2.5</rootOid>
    <isFound>false</isFound>
</n1:DocumentTemplate>

基本上我想将<rootOid>节点与值列表进行匹配。我已经创建了一个业务,它将与<rootOid>业务规则的条件中的硬编码值相匹配......只是作为概念证明来学习如何使用 BRE 和在业务流程中调用规则的基础知识。

除了在业务规则的“条件”中做一个巨大的硬编码 OR 列表之外,我找不到一种方法来匹配一个值列表。接受值的列表足够大,以至于做一堆 OR 是行不通的。

理想情况下,我希望有一个可维护的 XML 文件,其中包含可以<rootOid>从业务规则中检查的可接受值。

我也意识到有一种方法可以调用数据库并从表/列中读取值进行匹配,但我宁愿将 SQL 排除在等式之外,这样它就可以更加独立。

4

1 回答 1

1

一个“相等”的表达就足够了。您的 RHS 事实应该是另一个词汇项目。在 XML 类型的情况下,正确的路径将一个一个地提取所有值并导致多次评估并在匹配时分别触发一个动作。要记住的关键:BRE 是一个模式匹配引擎。

词汇表只是事实定义的一个方便的别名。假设您创建了一个具有以下结构的 XML 文件:

<options>
  <value>A</value>
  <value>B</value>
  <value>C</value>
</options>

为这个事实定义一个词汇表 Name: PossibleValues XPath Selector: /options/value XPath Field: 。

然后将规则定义为 IF currentValue == PossibleValues 将导致三个条件评估,因为 RHS 在工作记忆中产生三个事实。因此,只有那些为真的才会触发规则(动作)。将此与 BRE 在您从 XML 模式中选择一个节点时创建的默认定义进行比较,该节点只会断言一个(第一个)事实:

XPath 选择器:/options/ XPath 字段:值

(为简洁起见省略了命名空间)

在运行时将此 XML 文档作为参数传递给 BRE(无论是在编排中还是在 .Net 组件中,取决于 BRE 调用上下文)。在设计测试时,您必须实现 Fact Creator 组件(实现 IFactCreator)以提供所需参数的实例。

使用自定义事实检索器可以更好地管理长期事实(如问题中的事实)。事实检索器是一个实现 IFactRetriever 的 .Net 组件。有关详细信息,请参阅文档。内部事实检索器实现加载 XML(从磁盘)并将其作为 TypedXmlDocument 断言到工作内存中。

于 2013-08-11T18:05:36.667 回答