I. Introduction

I-A. Présentation

Enterprise Library (" EntLib ") est un framework contenant plusieurs blocs d'application (" application blocks "). Les blocs d'application permettent de résoudre les problèmes courants auxquels on est confronté lorsqu'on développe un projet. Les applications blocs encapsulent les méthodes de développement recommandées par Microsoft (" best practices "). Enterprise Library contient 6 blocs d'application :

  • Caching
  • Cryptography
  • Data Access
  • Exception Handling
  • Logging
  • Security

Enterprise Library inclut également un ensemble de fonctions fondamentales, notamment des services de configuration, d'instrumentation et de création d'objets. Ces fonctions sont utilisées par tous les autres blocs d'application.
Le framework est téléchargeable ici: EntLib V2Enterprise Library pour le Framework V2

I-B. Avantages

Il y a plusieurs avantages à utiliser le framework Enterprise Library :

  • Uniformité. Tous les blocs d'application utilisent les design pattern.
  • Extensibilité. Les blocs d'application permettent d'être personnalisés en offrant la possibilité d'ajouter du code dans les classes fournies.
  • Facile d'utilisation. Enterprise Library contient un outil graphique de configuration, une installation simple, une documentation utilisateur et des exemples d'application.
  • Integration. Les blocs d'application d'Enterprise Library sont conçus pour communiquer ensemble.
  • Gratuité. Enterprise Library est redistribué gratuitement.

I-C. Contenu d'Enterprise Library

Enterprise Library contient les éléments suivants :

  • Code source. L'installation d'Enterprise Library place le code source des blocs d'application, de la console de configuration et des QuickStarts dans le répertoire d'installation.
  • Tests d'unité. Enterprise Library inclut les tests d'unité créés lors du développement des blocs d'application.
  • QuickStarts. Les QuickStarts Enterprise Library sont de brèves illustrations faciles à comprendre des principales fonctionnalités des blocs d'application. Chaque bloc d'application inclut un ou plusieurs QuickStarts.
  • Documentation. Enterprise Library inclut une documentation pouvant être consultée dans le système d'aide de Visual Studio. La documentation inclut des instructions sur l'utilisation d'Enterprise Library, ainsi qu'une référence de bibliothèque de classes.

II. Détails des blocs d'application

II-A. Présentation

Pour construire une application, nous allons nous baser sur la figure 1.

Image non disponible
Figure 1 : ''Architecture d'une application''

Cette vue architecturale spécifie les différents composants de l'application. On reconnaît 3 macros couches : présentation, métier et accès aux données. Voici le détails de la composition de ces couches. Les exemples cités reprennent le cas d'un commerce en ligne.

  1. UI Components. C'est la couche visuelle de l'interface. Elle permet d'afficher les informations à l'utilisateur. Ce sont par exemple les pages ASP.NET, les WinForms...
  2. UI Process Components. Dans la plupart des cas, l'interaction de l'utilisateur avec le système suit un processus connu. Par exemple, l'utilisateur va choisir une catégorie de produits avant de sélectionner un produit particulier dans cette liste.
  3. Business Workflows. Une fois que les informations nécessaires sont collectées, elles peuvent être utilisées dans un processus relatif au métier. Par exemple, le système de commerce devra calculer le total des achats, valider la carte de crédit, procéder au payement, retirer les articles commandés du magasin, et procéder à la livraison des produits. Ces opérations doivent se faire dans le bon ordre et peuvent prendre du temps.
  4. Business Components. Ce composant implémente les règles métier. Par exemple, elle contiendra une fonction qui fait le total des prix des articles achetés, puis y applique une taxe spécifique (pays, type de produit...).
  5. Service Agents. Ce composant permet d'ouvrir l'application. Il permet en effet d'utiliser des fonctionnalités externes au système, et éventuellement de fournir une interface de format de données compatible avec le service extérieur. Il garantit l'isolation des processus en cas d'appel simultanés à différents services. Par exemple, le système pourra établir une connexion avec un établissement bancaire afin de valider le numéro de la carte de crédit, et prévenir la société de transport que les articles doivent être livrés.
  6. Service Interfaces. Ce composant ouvre la logique métier du système en exposant les services disponibles. C'est grâce à cette interface qu'on va pouvoir " attaquer " le coeur de l'application. Cette interface définit les modèles de communication en tenant compte de la sécurité, des exceptions, des formats de données...
  7. Data Access Logic Components. La plupart des applications accèdent aux données. Par exemple, l'application de commerce en ligne doit pouvoir retrouver le détail d'un produit que le client veut consulter.
  8. Business Entity Component. Les composants de l'application doivent pouvoir s'échanger des données. Cet échange peut se faire à différents formats. Cela peut être des données sérialisés (DataSets, DataReaders, XML...) ou directement des classes.
  9. Components for Security, Operational Management, and Communication. Ces composants servent à la gestion d'exceptions, aux autorisations et à la communication avec les autres services et applications.

II-B. Data Access Application Block

II-B-1. Champ d'action et caractéristiques

Le Data Access Application block se situe entre la brique Data Access Logic Components et la(es) source(s) de donnée(s).

Image non disponible
Figure 2 : ''Localisation du Data Access Application Block''

En utilisant les améliorations de .Net V2, il permet d'utiliser n'importe quelle base de données, grâce à un modèle qui encapsule les objets ADO.NET spécifiques aux bases de données.

II-B-2. Conception de l'Application Block

Voici le schéma de conception de l'application block, avec les classes principalement utilisées dans son domaine d'application.

Image non disponible
Figure 3 : ''Conception du Data Access Application Block''

II-B-3. Exemple

Cet exemple utilise le Data Access Application block pour récupérer un DataSet dans une base de données SQL Server. DatabaseFactory est une classe de l'application block qui contient une méthode CreateDatabase permettant de se connecter à la base de données. Cette méthode renvoie une classe Database, elle aussi issue du Data Access Application block. On prépare ensuite un objet DbCommand (framework DotNet) qui va permettre d'exécuter une procédure stockée. L'instance de l'objet Database contient une méthode afin d'ajouter des paramètres à la procédure stockée. On exécute ensuite la méthode ExecuteDataSet qui retourne un DataSet.

 
Sélectionnez

public DataSet GetProductsInCategory(int Category)
{
	// Create the Database object, using the default database service.
	// The default database service is determined through configuration.
	Database db = DatabaseFactory.CreateDatabase();
	
	string sqlCommand = "GetProductsByCategory";
	DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
	
	// Retrieve products from the specified category.
	db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, Category);
	
	// DataSet that will hold the returned results
	DataSet productsDataSet = null;

	productsDataSet = db.ExecuteDataSet(dbCommand);
	
	// Note: Connection was closed by ExecuteDataSet method call
	
	return productsDataSet;
}
					

II-C. Exception Handling Application Block

II-C-1. Champ d'action et caractéristiques

Cet application block permet de centraliser la gestion et le traitement des exceptions.

Image non disponible
Figure 4 : ''Localisation du Exception Handling Application Block''

Il permet également d'élaborer un système de journalisation des exceptions.
Cependant, il laisse la possibilité de créer ses propres exceptions.

II-C-2. Conception de l'Application Block

Voici le schéma de conception de l'application block, avec les classes principalement utilisées dans son domaine d'application.

Image non disponible
Figure 5 : ''Conception du Exception Handling Application Block''

II-C-3. Exemple

Cet exemple utilise la méthode statique HandleException de la classe ExceptionPolicy de l'application block.

 
Sélectionnez

try
{
	this.ProcessA();
}
catch(Exception ex)
{
	// Quick Start is configured so that the Propagate Policy will
	// log the exception and then recommend a rethrow.
	bool rethrow = ExceptionPolicy.HandleException(ex, "Propagate Policy");

	if (rethrow)
	{
		throw;
	}
}

Cet autre exemple utilise la méthode LogConfigurationError de la classe DefaultExceptionHandlingEventLogger appartenant à l'application block afin de journaliser les évènements d'exception.

 
Sélectionnez

try
{
	return factory.Create(policyName)
}
catch (ConfigurationErrorsException configurationException)
{
	try
	{
		DefaultExceptionHandlingEventLogger logger;
		logger = EnterpriseLibraryFactory.BuildUp<DefaultExceptionHandlingEventLogger>();
		logger.LogConfigurationError(configurationException, policyName);
	}
	catch{ }
	
	throw;
}

II-D. Caching Application Block

II-D-1. Champ d'action et caractéristiques

Avec le DotNet framework, il est possible de mettre en cache les données au niveau des couches de présentation.

Image non disponible
Figure 6 : ''Localisation du Caching Application Block''

Le Caching application block permet de stocker des données dans la couche métier de l'application. Il évite ainsi au système de persistance d'aller chercher les données lorsqu'on en a besoin.
Les données stockées dans la couche métier sont souvent des données de référence fréquemment utilisées. On peut citer par exemple les différents types de produits proposés, les taux de TVA...

II-D-2. Conception de l'Application Block

Voici le schéma de conception de l'application block, avec les classes principalement utilisées dans son domaine d'application.

Image non disponible
Figure 7 : ''Localisation du Caching Application Block''

II-D-3. Exemple

Cet exemple illustre comment la classe CacheManager de l'application block stocke les données nécessaires.

 
Sélectionnez

CacheManager primitivesCache;

Product product = new Product(
	"ProductId",
	"Name",
	"Price");

primitivesCache.Add(product.ProductID,
	procuct,
		enterNewItemForm.Priority,
		new ProductCacheRefreshAction(),
		new AbsoluteTime(this.enterNewItemForm.AbsoluteTime));

La récupération de données est effectuée simplement en utilisant la méthode GetData de l'objet CacheManager.

 
Sélectionnez

Product product = (Product) this.primitivesCache.GetData(id);

II-E. Logging Application Block

II-E-1. Champ d'action et caractéristiques

Cet application block permet de journaliser les évènements.

Image non disponible
Figure 8 : ''Localisation du Logging Application Block''

Il est configurable et permet de différencier les types de messages (informatifs ou d'erreur), ainsi que leur provenance (exceptions, actions de l'utilisateur, évènements concernant les données...).
Afin d'optimiser les performances de l'application, il permet d'être utilisé en asynchrone.

II-E-2. Conception de l'Application Block

Voici le schéma de conception de l'application block, avec les classes principalement utilisées dans son domaine d'application.

Image non disponible
Figure 9 : ''Conception du Logging Application Block''

II-E-3. Exemple

Cet exemple permet d'écrire dans la classe statique Logger de l'application block le LogEntry (lui aussi de l'application block).

 
Sélectionnez

// Creates and fills the log entry with user information.
LogEntry logEntry = new LogEntry();
logEntry.EventId = 10;
logEntry.Priority = 2;
logEntry.Message = ''Clic sur le bouton'';
logEntry.Categories.add(''UI'');

// Writes the log entry.
Logger.Write(logEntry);

II-F. Security Application Block

II-F-1. Champ d'action et caractéristiques

Le Security Application Block reprend tous les aspects sécurités liés à l'application.

Image non disponible
Figure 10 : ''Localisation du Security Application Block''

Il permet de couvrir 5 aspects de la sécurité : authentification, habilitations, rôles, profiles et caching.

II-F-2. Conception de l'Application Block

Voici le schéma de conception de l'application block, avec les classes principalement utilisées dans son domaine d'application.

Image non disponible
Figure 11 : ''Conception du Security Application Block''

II-F-3. Exemple

Dans cet exemple, nous allons illustrer la gestion des rôles. Cette gestion n'intègre pas l'application block car le framework V2 a rajouté des classes permettant d'effectuer ce travail. Cependant, cet application block n'est pas obsolète car outre la gestion des rôles, il permet de prendre en compte la gestion des l'authentification, des habilitations, des profiles de du caching.
Cette ligne ajoute un utilisateur à la base des utilisateurs grâce à la classe Membership qui fait partit du framework DotNet V2.

 
Sélectionnez

Membership.CreateUser("UserName", "Password");

On ajoute ensuite un rôle à la base des rôles en vérifiant qu'il n'est pas déjà présent en utilisant la classe Roles du DotNet framework V2, puis on autorise l'utilisateur à bénéficier de ce rôle.

 
Sélectionnez

if (!Roles.RoleExists(''RoleManager''))
{
	Roles.CreateRole(''RoleManager'');
}
Roles.AddUsersToRole(new string[] { ''UserName'' }, ''RoleManager'');

II-G. Cryptography Application Block

II-G-1. Champ d'action et caractéristiques

Le framework DotNet V2 permet de créer et d'utiliser des algorithmes de cryptage et de hachage. Cependant, il n'offre pas de système de persistance des clés découlant de ces algorithmes.

Image non disponible
Figure 12 : ''Localisation du Cryptography Application Block''

Il n'y a pas non plus de moyen facile pour ajouter facilement ses propres algorithmes de cryptographie.
Cet application block offre ces deux possibilités. De plus, il offre une approche cryptographique simplifiée par rapport au framework DotNet V2.

II-G-2. Conception de l'Application Block

Voici le schéma de conception de l'application block, avec les classes principalement utilisées dans son domaine d'application.

Image non disponible
Figure 13 : ''Conception du Cryptography Application Block''

II-G-3. Exemple

Cet exemple montre l'utilisation de la classe Cryptographer de l'application block afin d'encrypter une chaîne de caractère. On utilise la méthode EncryptSymmetric de cette classe afin de réaliser l'opération. Il faut spécifier une clé correspondant à un algorithme de codage décrit dans le fichier de configuration. On peut ainsi utiliser différents types d'encryption. Il suffit simplement que la clé soit décrite dans le fichier de configuration.

 
Sélectionnez

string valueToEncrypt = ''Mon texte à encrypter'';

this.encryptedContentsBase64 = Cryptographer.EncryptSymetric(
	''Ma clé du fichier de configuration'',
	valueToEncrypt);

III. Configuration Tool

Configuration Tool est l'outil de l'Enterprise Library permettant de configurer graphiquement les applications blocks. Cet outil est un petit programme Windows permettant de générer des fichiers de configuration. Ces fichiers (Web.config ou App.config) viendront remplacer les fichiers de l'application.

Image non disponible
Image non disponible

On distingue 3 zones : le noeud principal de l'outil dans la partie gauche, le détail du noed en cours dans la partie à droite et les éventuelles erreurs en bas de la fenêtre. En effectuant un click droit sur le noeud principal, on peut ajouter une nouvelle application.

Image non disponible

Une application correspond à un fichier de configuration. On peut donc dans ce même outil gérer plusieurs projets différents. Une fois la nouvelle application créée, on peut ajouter les applications blocks. Il est possible d'ajouter un ou plusieurs application block.

Image non disponible

L'outil se chargera d'agencer les blocs d'information dans le fichier de configuration.

Image non disponible

Il est possible de configurer les applications blocs : par exemple, dans le cadre d'une connexion à une base de données (Data Access Application Block), il est possible de définir une ou plusieurs chaîne de connexion. Chaque application block est configurable selon les critères qui le concernent.

IV. Conclusion

Comme nous l'avons vu, l'Enterprise Library couvre une grande partie des besoins des développeurs. On peut modeler à son gré les librairies qui le composent, ce qui en fait un outil très puissant.
La grande force de cet outil est la réutilisabilité du code.
Le but de ces briques est donc de favoriser la canonisation du code afin de ne développer qu'une fois les tâches communes à plusieurs projets.
Pour télécharger le framework, c'est ici: EntLib V2Enterprise Library pour le Framework V2
Merci à Olivier Delmotte pour la relecture de cet article.