Rules di WF senza Workflow

Questa settimana, durante un corso su WF, ho mostrato come sia possibile utilizzare le rule di WF anche senza avere necessariamente un workflow alle spalle. L’infrastruttura di WF infatti consente di valutare RuleSet anche senza che ci sia un workflow collegato. Dal momento poi che le rule di un workflow sono persistite all’interno di un file .rules (pur sempre XOML) differente da quello che rappresenta il flusso … facendo 1 + 1 possiamo definire regole esterne da usare in qualsisi programma che abbia bisogno di un motore di regole e poi valutarle con gli oggetti del framework di WF.

Ecco un esempio di codice che carica un file .rules da disco, lo deserializza usando il WorkflowMarkupSerializer, e ne valuta il risultato tramite la classe RuleEngine: 

XmlTextReader reader = new XmlTextReader(@”..\..\DiscountCouponWorkflow.rules”);
WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
RuleDefinitions rules = serializer.Deserialize(reader) as RuleDefinitions;
RuleSet ruleSet = rules.RuleSets["PriceRuleSet"];
RuleEngine ruleEngine = new RuleEngine(ruleSet, typeof(Customer));
ruleEngine.Execute(c);

Si noti il fatto che passo al motore di rule (l’istanza di RuleEngine) anche un oggetto come input del metodo Execute. Si tratta di un oggetto il cui tipo .NET รจ stato dichiarato nel costruttore della classe RuleEngine e rappresenta l’input su cui verranno applicate le regole. Ora, utilizzando un’interfaccia che descriva un comportamento comune a N diverse tipologie di oggetti, potremmo avere uno stesso file di regole applicabile sia ad un workflow, che implementa l’interfaccia nella definizione della sua classe, sia ad un nostro oggetto custom.