Assert
Assertion ist der Prozess zum Hinzufügen von Objektinstanzen zum Arbeitsspeicher der Geschäftsregel-Engine. Die Engine verarbeitet jede Instanz entsprechend den Bedingungen und Aktionen, die für den jeweiligen Instanztyp geschrieben werden. Dabei verwendet es die Übereinstimmungs-, Konfliktlösungs- und Aktionsphasen.
In den folgenden Themen werden Verhaltensweisen beschrieben, die sich aus der Verwendung der Assert-Funktion für verschiedene Faktentypen ergeben.
.NET-Objekte
Jedes Objekt wird als separate Instanz an den Arbeitsspeicher übergeben. Das bedeutet, dass die Instanz von jedem Prädikat analysiert wird, das auf den Objekttyp verweist (z. B. "IF Object.Property = 1"). Darüber hinaus wird sie je nach den Ergebnissen der Regelbedingungen Regelaktionen zur Verfügung gestellt, die auf den Typ verweisen.
Betrachten Sie das folgende Beispiel.
Regel 1
IF A.Value = 1
THEN A.Status = "good"
Regel 2
IF B.Value = 1
THEN A.Status = "good"
In Regel 1 wird die Status-Eigenschaft nur für Instanzen von A mit dem Wert 1 aktualisiert. Wenn die Bedingung jedoch in Regel 2 als true ausgewertet wird, werden alle Instanzen von A status aktualisiert. Wenn mehrere Instanzen von B vorhanden sind, werden die A-Instanzen jedes Mal aktualisiert, wenn die Bedingung für eine B-instance als true ausgewertet wird.
Um ein .NET-Objekt innerhalb einer Regel durchzusetzen, können Sie die integrierte Assert-Funktion als Regelaktion hinzufügen. Beachten Sie, dass die Regel-Engine über eine CreateObject-Funktion verfügt, aber nicht als separate Funktion im Business Rule Composer angezeigt wird. Ihr Aufruf wird erstellt, indem Sie die Konstruktormethode des zu erstellenden Objekts aus der .NET-Klassenansicht des Fakten-Explorers in den Aktionsbereich ziehen. Der Business Rule Composer übersetzt dann die Konstruktormethode in einen CreateObject-Aufruf in der Regeldefinition.
TypedXmlDocument
Wenn ein TypedXmlDocument bestätigt wird, erstellt die Geschäftsregel-Engine untergeordnete TypedXmlDocument-Instanzen basierend auf den in der Regel definierten Selektoren.
Auswahlzeiger und Felder sind XPath-Ausdrücke. Sie können sich Auswahlzeiger als Möglichkeit zur Isolierung von Knoten eines XML-Dokuments vorstellen. Felder identifizieren bestimmte Elemente innerhalb des jeweiligen Auswahlzeigers. Alle Felder in einem Auswahlzeiger werden von der Engine als Objekt zu einer Gruppe zusammengefasst. Wenn Sie unter der Registerkarte XML-Schemas im Explorer Fakten einen Knoten auswählen, füllt Business Rule Composer automatisch die XPath Selector-Eigenschaft für alle Knoten und die XPath Field-Eigenschaft für alle Knoten aus, die keine untergeordneten Knoten enthalten. Alternativ können Sie bei Bedarf eigene XPath-Ausdrücke für XPath-Selektor und XPath-Feld eingeben.
Wenn der Auswahlzeiger mehreren Teilen des XML-Dokuments entspricht, werden mehrere Objekte dieses Typs an den Arbeitsspeicher der Regel-Engine übergeben bzw. daraus zurückgezogen. Angenommen, Sie haben den folgenden XML-Code:
<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>
Wenn Sie den Auswahlzeiger "/root/order" (oder "//order") verwenden, werden dem Arbeitsspeicher zwei Objekte hinzugefügt.
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>
Innerhalb jedes Auswahlzeigers verweisen XPaths auf die einzelnen Felder.
Wenn Sie den Selektor /root/order/item (oder (/order/item oder //item) verwenden, werden dem Arbeitsspeicher der Regel-Engine vier Objekte hinzugefügt, die beiden Elemente für Joe und die beiden Elemente für Jane.
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
Jedes Objekt hat Zugriff auf drei Felder: @name, @quantityund @cost. Da das Objekt ein Verweis auf das Originaldokument ist, können Sie auf übergeordnete Felder verweisen (z. B. "../@customer").
In ein und demselben Dokument können Sie mehrere Auswahlzeiger benutzen. Dadurch können Sie mehrere Teile des Dokuments anzeigen (wenn zum Beispiel ein Teil die Bestellung und ein anderer die Versandadresse enthält). Denken Sie jedoch daran, dass die erstellten Objekte durch die XPath-Zeichenfolge definiert werden, mit der sie erstellt wurden. Die Verwendung eines anderen XPath-Ausdrucks, auch wenn er in denselben Knoten aufgelöst wird, führt zu einem eindeutigen TypedXmlDocument.
Die Regel-Engine bietet eine systemeigene Unterstützung für grundlegende .NET-Skalartypen sowie Objekte für Verweistypen. XML-Dokumente sind im Grunde Text, aber je nach dem Typ, der beim Erstellen der Regel angegeben wurde, kann der Feldwert einen beliebigen Typ haben. Außerdem können die Felder, da sie XPath-Ausdrücke sind, einen Knotensatz zurückgeben. In diesem Fall wird das erste Element im Satz als Wert verwendet.
Im Hintergrund kann die Regel-Engine einen Textfeldwert über die XmlConvert-Funktion in einen der unterstützten Typen konvertieren. Den gewünschten Typ können Sie im Geschäftsregelersteller festlegen. Wenn keine Konvertierung möglich ist, wird eine Ausnahme ausgelöst. Die Typen bool und double können nur als ihren jeweiligen Typ, Zeichenfolgen oder Objekte abgerufen werden.
TypedDataTable
Wenn eine TypedDataTable bestätigt wird, werden alle in der DataTable enthaltenen DataRows automatisch als TypedDataRows in der Engine bestätigt. Wenn eine Tabelle oder Tabellenspalte als Regelargument verwendet wird, wird der Ausdruck für die einzelnen TypedDataRows und nicht für die TypedDataTable ausgewertet.
Angenommen, Sie haben für die Tabelle "Customers" die folgende Regel erstellt:
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
Hinweis
Um eine Regel für eine Datenbanktabelle zu erstellen, müssen Sie Datentabelle/Zeile als Datenbankbindungstyp verwenden.
Angenommen, Sie behaupten die folgende DataTable mit drei DataRows in der Engine (als TypedDataTable).
CustomerID | ContactTitle |
---|---|
001 | Supply Clerk |
002 | Supply Clerk |
003 | Supply Clerk |
Die Engine fügt drei TypedDataRows ein: 001, 002 und 003.
Jeder TypedDataRow wird unabhängig anhand der Regel ausgewertet. Der erste TypedDataRow erfüllt die Regelbedingung, und die zweiten beiden schlagen fehl. Die Ergebnisse sehen wie folgt aus.
CustomerID | ContactTitle |
---|---|
001 | Purchasing Manager |
002 | Supply Clerk |
003 | Supply Clerk |
Hinweis
"TypedDataRows" können auch direkt an die Engine übergeben werden. Sie werden genauso verarbeitet wie oben beschrieben.
DataSetName.DataTableName gilt als eindeutiger Bezeichner. Wenn also eine zweite TypedDataTable mit demselben DataSet-Namen und DataTable-Namen bestätigt wird, ersetzt sie die erste TypedDataTable. Alle TypedDataRow-Elemente, die der ersten TypedDataTable zugeordnet sind, werden zurückgezogen, und die zweite TypedDataTable wird bestätigt.
DataConnection
Wie bei einer TypedDataTable führt das Ziehen einer Tabelle oder Spalte als Regelargument im Business Rule Composer zu Regeln, die für die zurückgegebenen TypedDataRowserstellt wurden, und nicht für die DataConnection selbst.
Angenommen, die folgende Regel wird erstellt, und eine DataConnection wird bestätigt, die eine SqlConnection mit Northwind.Customers enthält:
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
Wenn die Engine die im Abschnitt TypedDataTable verwendete Regel auswertet, erstellt sie dynamisch eine Abfrage, die wie folgt aussieht:
SELECT *
FROM Northwind.Customers
WHERE CustomerID = 1
Da nur eine Zeile in der Datenbank dieses Kriterium erfüllt, wird nur eine TypedDataRow erstellt und zur weiteren Verarbeitung in der Engine bestätigt.
Zusammenfassung der übergebenen Entitäten und Instanztypen
In der folgenden Tabelle wird das Übergabeverhalten für die verschiedenen Typen aufgeführt. Die Tabelle enthält die Anzahl der Instanzen, die in der Engine für jede übergebene Entität erstellt werden, sowie den Typ, anhand dessen die einzelnen Instanzen identifiziert werden.
Entität | Anzahl der übergebenen Instanzen | Instanztyp |
---|---|---|
.NET-Objekt | 1 (das Objekt selbst) | Voll gekennzeichnete .NET-Klasse |
TypedXmlDocument | 1-N TypedXmlDocument(s): Basierend auf erstellten Selektorbindungen und Dokumentinhalten | DocumentType.Selector |
TypedDataTable | 1-N TypedDataRow(s): eine für jede "DataRow" in der "DataTable" |
DataSetName.DataTableName |
TypedDataRow | 1 (die übergebene "TypedDataRow") | DataSetName.DataTableName |
DataConnection | 1-N (eine für jede "TypedDataRow", die durch Abfragen der "DataConnection" zurückgegeben wurde) | DataSetName.DataTableName |