Assert
判斷提示 是將物件實例新增至商務規則引擎工作記憶體的程式。 引擎會根據針對執行個體類型所寫入的條件與動作,使用相符-衝突解析-動作階段來處理每個執行個體。
下列主題描述針對不同事實類型使用 Assert 函式所產生的行為。
每個物件都會判斷提示到工作記憶體中,以做為個別的執行個體。 這表示執行個體是由參考物件類型 (例如,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 實例。
選取器和欄位都是 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 函式,將文字域值轉換成任何一個支援的類型。 您可以藉由在「商務規則編輯器」中設定類型來加以指定。 若無法轉換,則會擲出一個例外狀況。 bool和double類型只能擷取為各自的類型、字串或物件。
當TypedDataTable判斷提示時,DataTable中包含的所有DataRows都會自動判斷提示到引擎中,做為TypedDataRows。 每當使用資料表或資料表資料行做為規則引數時,都會根據個別 TypedDataRows評估運算式,而不是針對 TypedDataTable評估。
例如,假設您為「客戶」資料表建立了下列規則:
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
注意
若要針對資料庫資料表建置規則,您必須使用 [資料表/ 資料列 ] 作為資料庫系結類型。
假設您在引擎中判斷提示下列 DataTable ,其中三個 DataRow (為 TypedDataTable) 。
CustomerID | ContactTitle |
---|---|
001 | 供應職員 |
002 | 供應職員 |
003 | 供應職員 |
引擎會插入三個 TypedDataRows:001、002 和 003。
每個 TypedDataRow 都會根據規則獨立評估。 第一個 TypedDataRow 符合規則條件,而第二個則失敗。 結果如下所示。
CustomerID | ContactTitle |
---|---|
001 | 採購經理 |
002 | 供應職員 |
003 | 供應職員 |
注意
TypedDataRows 也可以直接判斷提示到引擎。 會以稍早所述的相同方式來處理這些項目。
DataSetName.DataTableName會被視為唯一識別碼。 因此,如果使用相同的DataSet 名稱和 DataTable名稱判斷提示第二個TypedDataTable,則會取代第一個TypedDataTable。 所有與第一個TypedDataTable 相關聯的 TypedDataRow都會撤銷,並判斷提示第二個TypedDataTable。
如同 TypedDataTable,將資料表或資料行拖曳為商務規則編輯器中的規則引數,會產生針對傳回 的 TypedDataRow所建置的規則,而不是 DataConnection 本身。
假設已建立下列規則,並判斷提示 DataConnection 包含 Northwind.Customers 的 SqlConnection :
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 |