Condividi tramite


Asserzione

L'asserzione è il processo di aggiunta di istanze di oggetti nella memoria di lavoro del motore di regole aziendali. Il motore elabora ogni istanza in base alle condizioni e alle azioni relativi al tipo di istanza, utilizzando le fasi di corrispondenza, risoluzione dei conflitti e azione.

Negli argomenti seguenti vengono descritti i comportamenti risultanti dall'uso della funzione Assert per tipi di fatti diversi.

Oggetti .NET

Ogni oggetto viene asserito nella memoria di lavoro come istanza separata. Ciò significa che l'istanza viene analizzata da ogni predicato che fa riferimento al tipo dell'oggetto ( ad esempio, IF Object.Property = 1). Viene inoltre resa disponibile per le azioni della regola che si riferiscono al tipo, in base ai risultati delle condizioni della regola.

Si consideri l'esempio seguente.

Regola 1

IF A.Value = 1  
THEN A.Status = "good"  

Regola 2

IF B.Value = 1  
THEN A.Status = "good"  

Nella regola 1, solo le istanze di A con valore 1 avranno la proprietà Status aggiornata. Nella regola 2, tuttavia, se la condizione restituisce true, tutte le istanze di A avranno lo stato aggiornato. Infatti, se sono presenti più istanze di B, le istanze A verranno aggiornate ogni volta che la condizione restituisce true per un'istanza B.

Per asserire un oggetto .NET dall'interno di una regola, è possibile aggiungere la funzione Assert predefinita come azione regola. Si noti che il motore delle regole ha una funzione CreateObject , ma non viene visualizzata come funzione separata in Business Rule Composer. La chiamata viene creata trascinando il metodo del costruttore dell'oggetto che si desidera creare dalla visualizzazione della Classe .NET di Esplora fatti al pannello delle azioni. Business Rule Composer converte quindi il metodo del costruttore in una chiamata CreateObject nella definizione della regola.

TypedXmlDocument

Quando viene asserito un TypedXmlDocument, il Motore delle Regole Aziendali crea delle istanze figlio di TypedXmlDocument in base ai selettori definiti nella regola.

I selettori e i campi sono entrambe espressioni XPath. È possibile considerare i selettori come un modo per isolare i nodi di un documento XML e i campi come identificazione di elementi specifici all'interno del selettore. Tutti i campi all'interno di un selettore vengono raggruppati come oggetto dal motore. Quando si seleziona un nodo nella scheda XML Schemi nell'Esploratore di fatti, il Business Rule Composer compila automaticamente la proprietà Selettore XPath per tutti i nodi e la proprietà Campo XPath per ogni nodo che non contiene nodi figlio. In alternativa, è possibile immettere le proprie espressioni XPath per XPath Selector e XPath Field , se necessario.

Se il selettore corrisponde a più parti del documento XML, più oggetti di questo tipo vengono inseriti o rimossi dalla memoria di lavoro del motore di regole. Si supponga di avere il codice XML seguente.

<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>  

Se si usa il selettore /root/order (o //order), due oggetti vengono aggiunti alla memoria di lavoro.

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>  

All'interno di ogni selettore, i singoli campi vengono indicati da XPaths.

Se si usa il selettore /root/order/item (o (/order/item o //item), quattro oggetti vengono aggiunti alla memoria di lavoro del motore regole, i due elementi per Joe e i due elementi per Jane.

<root>  
   <order customer="Joe">  
  
   </order>  
   <order customer="Jane">  
  
   </order>  
</root>  

Ogni oggetto ha accesso a tre campi, @name, @quantitye @cost. Poiché l'oggetto è un riferimento al documento originale, è possibile fare riferimento ai campi padre , ad esempio ".. /@customer").

È possibile usare più selettori all'interno dello stesso documento. Ciò consente di visualizzare parti diverse del documento( ad esempio, se una sezione è l'ordine e un'altra sezione contiene l'indirizzo di spedizione). Tenere tuttavia presente che gli oggetti creati vengono definiti dalla stringa XPath che li ha creati. L'uso di un'espressione XPath diversa, anche se si risolve nello stesso nodo, genera un TypedXmlDocument univoco.

Il motore regole supporta tipi scalari .NET di base in modo nativo, nonché oggetti per i tipi di riferimento. I documenti XML sono fondamentalmente testo, ma in base al tipo specificato al momento della compilazione della regola, il valore del campo può essere di qualsiasi tipo. Inoltre, poiché i campi sono espressioni XPath, possono restituire un set di nodi, nel qual caso il primo elemento del set è utilizzato come valore.

Dietro le quinte, il motore di regole può convertire un valore di campo di testo in uno dei tipi supportati tramite la funzione XmlConvert. È possibile specificare questa impostazione impostando il tipo in Business Rule Composer. Se non è possibile eseguire una conversione, viene generata un'eccezione. I tipi bool e double possono essere recuperati solo come tipo, stringhe o oggetti corrispondenti.

TypedDataTable

Quando un oggetto TypedDataTable viene asserito, tutti i DataRows contenuti in DataTable vengono automaticamente asseriti nel motore come TypedDataRows. Ogni volta che una tabella o una colonna di tabella viene utilizzata come argomento di regola, l'espressione viene valutata rispetto al singolo TypedDataRows e non a TypedDataTable.

Si supponga, ad esempio, di avere la regola seguente compilata in base a una tabella "Clienti":

IF Northwind.Customers.CustomerID = 001  
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"  

Annotazioni

Per compilare una regola in base a una tabella di database, è necessario usare Tabella dati/riga come tipo di associazione di database.

Si supponga di inserire la seguente DataTable, composta da tre DataRows, nel motore (come TypedDataTable).

ID Cliente Titolo del contatto
001 Addetto/a ai Materiali
002 Addetto alla Fornitura
003 Impiegato addetto alle forniture

Il motore inserisce tre TypedDataRows: 001, 002 e 003.

Ogni TypedDataRow viene valutato in modo indipendente rispetto alla regola. Il primo TypedDataRow soddisfa la condizione della regola e i secondi due hanno esito negativo. I risultati vengono visualizzati nel modo seguente.

ID Cliente Titolo di Contatto
001 Manager acquisti
002 Addetto alle forniture
003 Impiegato alle forniture

Annotazioni

TypedDataRows può anche essere asserito direttamente nel motore. Questi vengono elaborati nello stesso modo descritto in precedenza.

DataSetName.DataTableName viene considerato un identificatore univoco. Pertanto, se un secondo TypedDataTable viene asserito con lo stesso nome dataset e il nome di DataTable , sostituisce il primo TypedDataTable. Tutti i TypedDataRow associati al primo TypedDataTable vengono ritirati e il secondo TypedDataTable viene definito.

DataConnection

Come per un oggetto TypedDataTable, il trascinamento di una tabella o di una colonna come argomento regola nel Business Rule Composer comporta regole compilate in base agli oggetti TypedDataRow restituiti, anziché alla DataConnection stessa.

Si supponga che venga creata la regola seguente e che venga asserita una connessione di DataConnection che contiene una SqlConnection su Northwind.Customers.

IF Northwind.Customers.CustomerID = 001  
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"  

Quando il motore valuta la regola usata nella sezione TypedDataTable , compila dinamicamente una query simile alla seguente:

SELECT *  
FROM Northwind.Customers  
WHERE CustomerID = 1  

Poiché solo una riga nel database soddisfa questo criterio, viene creata e asserta nel motore un solo typedDataRow per un'ulteriore elaborazione.

Riepilogo delle entità asserte e dei tipi di istanza

Nella tabella seguente viene riepilogato il comportamento di asserzione per i vari tipi, che mostra il numero di istanze risultanti create nel motore per ogni entità asserta, nonché il tipo applicato a ognuna di queste istanze per identificarli.

Entità Numero di istanze asserte Tipo di istanza
Oggetto .NET 1 (oggetto stesso) Classe .NET completa
TypedXmlDocument 1-N TypedXmlDocument(s): in base alle associazioni del selettore create e al contenuto del documento DocumentType.Selector
TabellaDatiTipizzata 1-N TypedDataRow(s):

Uno per ciascun DataRow nel DataTable
DataSetName.DataTableName
TypedDataRow 1 (TypedDataRow affermato) DataSetName.DataTableName
DataConnection 1-N (uno per ogni TypedDataRow restituito eseguendo una query su DataConnection) DataSetName.DataTableName

Vedere anche

Funzioni di controllo motore