External RuleSet Toolkit, exemple
Généralement, lorsque des règles sont utilisées dans une application de workflow, elles font partie de l'assembly. Dans certains cas, il peut être préférable de gérer les RuleSets séparément de l'assembly afin qu'ils soient mis à jour sans que la génération et le déploiement de l'assembly de workflow ne soient nécessaires. Cet exemple vous permet de gérer et de modifier des RuleSets dans une base de données et d'accéder à ceux-ci à partir d'un workflow au moment de son exécution, opération qui permet aux instances de workflow en cours d'intégrer automatiquement des modifications de RuleSets.
Remarque : |
---|
Cet exemple requiert l'installation de .NET Framework version 3.5 pour être généré et exécuté. Visual Studio 2008 est nécessaire pour l'ouverture des fichiers projet et solution. |
L'exemple External RuleSet Toolkit contient un utilitaire basé sur les Windows Forms pouvant être utilisé pour gérer et modifier les versions d'un RuleSet dans une base de données. Il inclut également une activité et un service hôte permettant d'exécuter ces règles.
Remarque : |
---|
Cet exemple requiert Microsoft SQL Server. |
Microsoft Visual Studio 2005 contient un outil RuleSet editor, issu de Windows Workflow Foundation (WF). Vous pouvez démarrer cet éditeur en double-cliquant sur l'activité Policy
dans un workflow ; cette opération sérialise l'objet RuleSet défini au fichier .rules associé au workflow (une activité Policy exécute une instance RuleSet sur le workflow). Le fichier .rules est compilé dans l'assembly en tant que ressource lors de la génération du projet de workflow.
Les composants de cet exemple incluent les éléments suivants :
- Un outil GUI RuleSet pouvant être utilisé pour modifier et gérer des versions de RuleSets dans la base de données.
- Un service de RuleSet configuré dans l'application hôte et accédant aux RuleSets de la base de données.
- Une activité ExternalPolicy nécessitant un RuleSet du service de RuleSet et exécutant ce RuleSet sur le workflow.
L'interaction des composants est présentée sur la figure 1. Les sections qui suivent décrivent chacun de ces composants.
Figure 1 : Vue d'ensemble de l'exemple
Outil RuleSet
La figure 2 présente une capture d'écran de l'outil RuleSet. Le menu Rule Store permet de charger les RuleSets disponibles dans la base de données et d'enregistrer dans le magasin ceux qui ont été modifiés. Un fichier de configuration d'application contient une chaîne de connexion pour la base de données RuleSet. Lorsque vous démarrez l'outil, ce dernier charge automatiquement les RuleSets à partir de la base de données configurée.
Figure 2 : Navigateur de RuleSet
L'outil RuleSet applique aux RuleSets des numéros de version principaux et secondaires, vous permettant de gérer et de stocker simultanément plusieurs versions. Il ne dispose pas de fonctionnalités de verrouillage ou de contrôle de configuration en plus de ces fonctionnalités de versions. Cet outil vous permet de créer des versions de RuleSets ou de supprimer des versions existantes. Lorsque vous cliquez sur New, l'outil crée un nom de RuleSet et lui applique la version 1.0. Lorsque vous copiez une version, l'outil crée une copie de la version du RuleSet sélectionné, y compris les règles qu'il contient, et assigne de nouveaux numéros de version uniques. Ces numéros sont basés sur ceux de RuleSets existants. Vous pouvez changer le nom d'un RuleSet et ses numéros de version en utilisant les champs associés sur le formulaire.
Lorsque vous cliquez sur Edit Rules, l'outil RuleSet editor démarre, comme illustré sur la figure 3.
Figure 3 : Outil RuleSet Editor
Il s'agit d'une nouvelle présentation de la boîte de dialogue de l'éditeur, qui fait partie du complément Visual Studio de Windows Workflow Foundation. Elle contient les mêmes fonctionnalités, y compris la prise en charge Intellisense. Les règles sont créées pour un type de cible (un workflow, par exemple) qui est associé au RuleSet dans l'outil ; lorsque vous cliquez sur Browse dans la boîte de dialogue principale de l'outil, la boîte de dialogue Workflow/Type Selector s'affiche, comme illustré sur la figure 4.
Figure 4 : Workflow/Type Selector
Vous pouvez utiliser la boîte de dialogue Workflow/Type Selector pour indiquer un assembly ainsi qu'un type spécifique faisant partie de cet assembly. Ce type correspond au type de cible pour lequel les règles sont créées (et exécutées). Dans de nombreux cas, le type de cible est un workflow ou un autre type d'activité. Toutefois, il est possible d'exécuter un RuleSet sur tout type .NET.
Le chemin d'accès au fichier d'assembly et le nom du type sont stockés avec le RuleSet dans la base de données, afin que l'outil puisse essayer de charger le type de cible automatiquement lorsque le RuleSet est récupéré de la base de données.
Lorsque vous cliquez sur OK dans la boîte de dialogue Workflow/Type Selector, l'outil valide le type sélectionné pour le RuleSet afin de garantir que ce type contient tous les membres référencés par les règles. Des erreurs s'affichent dans la boîte de dialogue Validation Errors (voir figure 5). Vous pouvez poursuivre la procédure de modification sans tenir compte de ces erreurs ou cliquer sur Cancel. Dans le menu Tools de la boîte de dialogue principale de l'outil, vous pouvez cliquer sur Validate pour valider à nouveau la version du RuleSet correspondant à l'activité cible.
Figure 5 : Erreurs de validation
Dans le menu Data de l'outil, vous pouvez importer et exporter des RuleSets. Lorsque vous cliquez sur Import, une boîte de sélection de fichier apparaît, vous permettant de sélectionner un fichier .rules. Il peut s'agir ou non d'un fichier créé initialement dans Visual Studio. Le fichier .rules doit contenir une instance de RuleDefinitions
sérialisée qui dispose d'une collection de conditions et d'une collection de RuleSets. L'outil n'utilise pas la collection de conditions, mais il utilise le format RuleDefinitions.rules pour permettre l'interaction avec l'environnement Visual Studio.
Lorsque vous sélectionnez un fichier .rules, la boîte de dialogue RuleSet Selector s'affiche (voir figure 6). Celle-ci permet de sélectionner les RuleSets que vous souhaitez importer à partir du fichier (par défaut, tous les RuleSets sont sélectionnés). Les RuleSets d'un fichier .rules ne disposent pas de numéros de version, car leur version dans un projet WF est identique à celle de l'assembly. Lors du processus d'importation, l'outil assigne automatiquement le numéro de version principal disponible suivant (ce numéro peut être modifié après l'importation) ; vous pouvez consulter les numéros de version assignés dans la liste RuleSet Selector.
Pour chaque RuleSet importé, l'outil tente de localiser le type associé dans le dossier bin\Debug qui se trouve sous l'emplacement du fichier .rules (s'il existe), en fonction des membres utilisés dans le RuleSet. Si l'outil détecte plusieurs types correspondants, il essaie d'en choisir un en fonction d'une correspondance entre le nom de fichier .rules et celui du type (par exemple, le type Workflow1 correspond au fichier Workflow1.rules). Si plusieurs noms concordent, vous êtes invité à sélectionner le type. Si ce mécanisme d'identification automatique ne parvient pas à localiser un assembly ou un type correspondant, vous pouvez, après l'importation, cliquer sur Browse dans la boîte de dialogue principale de l'outil et accéder au type associé que vous souhaitez.
Figure 6 : RuleSet Selector
Lorsque vous cliquez sur Data-Export dans le menu principal de l'outil, la boîte de dialogue RuleSet Selector s'affiche à nouveau. Celle-ci vous permet de déterminer le RuleSet qui doit être exporté de la base de données. Lorsque vous cliquez sur OK, la boîte de dialogue Save File s'affiche. Celle-ci vous permet d'indiquer le nom et l'emplacement du fichier .rules. Le fichier .rules ne contenant aucune information sur la version, vous pouvez sélectionner une seule version de RuleSet répondant à un nom donné.
Activité PolicyFromService
Le code correspondant à l'activité PolicyFromService est très simple. Il fonctionne exactement comme l'activité Policy fournie avec WF, mais au lieu de récupérer le RuleSet cible dans le fichier .rules, il appelle un service hôte pour obtenir l'instance de ce RuleSet. Il exécute ensuite le RuleSet sur l'instance de l'activité du workflow racine.
Pour utiliser l'activité dans un workflow, ajoutez une référence aux assemblys PolicyActivities et RuleSetService de votre projet de workflow. Consultez la procédure située à la fin de cette rubrique pour savoir comment ajouter une activité à la boîte à outils.
Après avoir ajouté l'activité à votre workflow, vous devez indiquer le nom du RuleSet à exécuter. Vous pouvez indiquer ce nom en tant que valeur littérale ou le lier à la variable ou à la propriété de workflow d'une autre activité. Vous pouvez également indiquer des numéros de version pour le RuleSet à exécuter (facultatif). Si vous laissez la valeur par défaut (0) comme numéro de version principal ou secondaire, le numéro de version le plus récent figurant dans la base de données sera automatiquement assigné à l'activité.
Service de RuleSet
Ce service est chargé de récupérer dans la base de données la version indiquée du RuleSet et de la renvoyer à l'activité appelante. Comme indiqué précédemment, si la valeur des versions principales et secondaires passées dans l'appel GetRuleSet
est de 0, le service récupère la version la plus récente. À ce stade, aucune mise en cache des définitions ou des instances de RuleSets n'est effectuée ; de la même façon, aucune fonctionnalité visant à marquer certaines versions de RuleSets comme étant « déployées » (afin de les différencier des RuleSets en cours) n'est appliquée.
La base de données devant être consultée par le service doit être configurée sur l'hôte à l'aide d'un fichier de configuration d'application.
Exécution de l'outil
Le dossier de configuration de la table RuleSet utilisée par l'outil et par le service contient un fichier Setup.sql. Vous pouvez exécuter le fichier de commandes Setup.cmd pour créer la base de données Rules dans SQL Express et configurer la table RuleSet.
Si vous modifiez le fichier de commandes ou Setup.sql et indiquez de ne pas utiliser SQL Express ou d'ajouter la table dans une base de données autre que Rules, les fichiers de configuration d'application de l'outil RuleSet et les projets UsageSample doivent être modifiés pour contenir les mêmes informations.
Après avoir exécuté le script Setup.sql, vous pouvez générer la solution ExternalRuleSetToolkit puis exécuter l'outil RuleSet à partir du projet ExternalRuleSetTool.
La solution RuleSetToolkitUsageSample Sequential Workflow Console Application contient un exemple de workflow. Ce dernier se compose d'une activité PolicyFromService et de deux variables (
orderValue
etdiscount
) sur lesquelles le RuleSet cible s'exécute.Pour utiliser cet exemple, générez la solution RuleSetToolkitUsageSample. Puis, dans le menu principal de l'outil RuleSet, cliquez sur Data-Import et pointez vers le fichier DiscountRuleSet.rules qui se trouve dans le dossier RuleSetToolkitUsageSample. Cliquez sur l'option de menu Rule Store-Save pour enregistrer le RuleSet importé dans la base de données.
L'assembly PolicyActivities étant référencé à partir du projet de workflow exemple, l'activité PolicyFromService apparaît dans le workflow. Toutefois, elle ne s'affiche pas par défaut dans la boîte à outils. Pour l'ajouter à la boîte à outils, procédez comme suit :
- Cliquez avec le bouton droit sur la boîte à outils et sélectionnez Choose Items (cette opération peut prendre un certain temps).
- Lorsque la boîte de dialogue Choose Toolbox Items s'affiche, cliquez sur l'onglet Activities.
- Naviguez jusqu'à l'assembly PolicyActivities de la solution ExternalRuleSetToolkit, puis cliquez sur Open.
- Assurez-vous que l'activité PolicyFromService est sélectionnée dans la boîte de dialogue Choose Toolbox Items puis cliquez sur OK.
- L'activité doit désormais s'afficher dans la boîte à outils, sous la catégorie RuleSetToolkitUsageSample Components.
Le service de RuleSet est déjà configuré dans l'application console hôte via l'instruction suivante dans Program.cs.
workflowRuntime.AddService(new RuleSetService());
Vous pouvez également configurer le service sur l'hôte en utilisant un fichier de configuration ; consultez la documentation du kit de développement logiciel (SDK) pour plus de détails.
Un fichier de configuration d'application est ajouté au projet de workflow afin d'indiquer la chaîne de connexion correspondant à la base de données devant être utilisée par le service. Cette chaîne doit être la même que celle utilisée par l'outil RuleSet, laquelle cible la base de données contenant la table RuleSet.
Vous pouvez désormais exécuter le projet RuleSetToolkitUsageSample comme s'il s'agissait de toute autre application console de workflow. Appuyez sur F5 ou Ctrl+F5 dans Visual Studio ou exécutez directement le fichier RuleSetToolkitUsageSample.exe.
Remarque : Vous devez fermer l'outil RuleSet pour recompiler l'exemple d'utilisation, car l'outil charge l'assembly correspondant à cet exemple.