Business Rules Engine : Modifier une règle par programmation
Les moteurs de règles deviennent indispensables dans l'implémentation des processus métier d'entreprises devant rester agiles face aux différents marchés sur lesquels elles opèrent. BizTalk Server offre la possibilité de s'appuyer sur un moteur de règle permettant de modifier le comportement d’un processus en production sans modifier sa définition et d'exprimer les règles métiers dans un langage naturel sans requérir au développement.
Business Rules Engine (BRE), inclu dans les composants BizTalk Server, permet certes via son concepteur de modifier aisément le comportement d'un processus mais nécessite tout de même une bonne connaissance des flux applicatifs échangés. Dans certains cas, il peut donc être nécessaire de fournir au sein d'une interface Web ou Winform la possibilité de modifier la valeur d'une condition dans une règle métier sans pour autant donner accès à l'ensemble des fonctionnalités de conception des règles.
Prenons donc un exemple simple de règle basée sur un déclenchement en fonction d'un montant. Dans sa première version, cette règle est créée de la manière suivante via le concepteur de règle :

A ce stade, il parait déjà évident que le test effectué ici sera amené à être modifié. Cas typique des règles métiers appliquées à la finance ...
L'implémentation par le biais du modèle objet du moteur de règle permet d'accéder simplement aux différentes règles déployées et d'en modifier leur définition. Le code présenté ci-dessous repose entièrement sur le référencement suivant :
-
Namespace : Microsoft.RuleEngine
-
Assembly : Microsoft.RuleEngine.dll
-
Chemin : C:\Program Files\Common Files\Microsoft BizTalk\Microsoft.RuleEngine.dll
Le code qui suit permet d'accéder à la règle précédemment illustrée et d'en modifier la valeur de la condition :
RuleSetDeploymentDriver driver = new RuleSetDeploymentDriver(); RuleStore ruleStore = driver.GetRuleStore(); RuleSetInfo ruleSetInfo = driver.GetDeployedRuleSets("RulesEngineDemo")[0]; RuleSet ruleSet = ruleStore.GetRuleSet(ruleSetInfo); Rule rule = ruleSet.Rules["Case"]; rule.Conditions = new Equal(((Equal)rule.Conditions).LeftArgument, new Constant(300)); |
Cette dernière ligne de code permet de manipuler directement la condition et d'affecter une nouvelle valeur, ici à 300. Ce cas d'exemple reste très simple puisque ne faisant pas appel aux opérateurs logiques (AND, OR ...) et qu'il n'implique qu'une seule condition dont on connait à l'avance la définition.
Pour publier la modification de la règle et de sa condition d'exécution, deux solutions sont possibles :
-
Modification de la règle actuellement déployée sans modification de sa version.
-
Modification de la règle par ajout d'une nouvelle version déployée.
Le premier cas nécessite l'ajout des quelques lignes de codes suivantes :
driver.Undeploy(ruleSetInfo); ruleStore.Remove(ruleSet); ruleStore.Add(ruleSet, true); driver.Deploy(ruleSetInfo); |
On constate donc que la version de la règle reste inchangée alors que la valeur de la condition a bien été modifiée :

Le second cas nécessite l'ajout des quelques lignes de codes suivantes :
ruleSet.CurrentVersion.MinorRevision += 1; ruleStore.Add(ruleSet, true); driver.Deploy(new RuleSetInfo(ruleSetInfo.Name, ruleSetInfo.MajorRevision, ruleSetInfo.MinorRevision + 1)); |
On constate bien cette fois-ci qu'une nouvelle version a été déployée et que la valeur de la condition a bien été modifiée :

Dans la majeure partie des cas, il reste préférable d'appliquer la seconde solution qui permet d'avoir l'historique des versions déployées en production et de revenir le cas échéant à une version précédente.
Point important dans le déploiement de nouvelles règles : BizTalk Server gère en interne un cache des policies déployées et utilisées au sein des processus métier. Le service "RuleEngineUpdateService" est chargé de controler le déploiement de nouvelles versions et effectue donc un polling de la base toute les 60s (valeur par défaut).
Autre point, le code utilisé dans cette exemple fonctionne avec BizTalk Server 2006 et BizTalk Server 2006 R2 (en béta 2 pour le moment) et devrait fontionner aussi avec BizTalk Server 2004, ce qui reste intéressant en termes de compatibilité ascendante.
Ressources :
Creating and Using Business Rules : http://msdn2.microsoft.com/en-us/library/aa577691.aspx
Programming with Business Rules Framework : http://msdn2.microsoft.com/en-us/library/aa561833.aspx
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :