Laurent Kempé
Indexer et rechercher vos entités métier à l'aide du Framework Lucene.Net
Conception à l'aide des génériques et de la réflexion d'un moteur de recherche permettant d'indexer et rechercher du contenu dans des entités métier sans les polluer.
Par Laurent Kempé publié le 12/11/2007 à 00:04, lu 3254 fois, 6 pages
 3 | Architecture de la solution
L'idée principale est de pouvoir définir les propriétés d'une entité du domaine qui doivent être indexées lorsque celle-ci est sauvegardée ou mise à jour dans le système de persistance retenu.
En ayant comme but de ne pas polluer notre domaine par quoi que ce soit d'extérieur, on arrive vite à l'idée que nous devons enrichir nos entités à l'aide de métadonnées. Le souci c'est qu'il faudra connaitre à l'exécution la métadonnée qu'il faut rechercher dans l'entité afin d'indexer le contenu de la propriété décorée.
Comme un des buts est d'obtenir un Framework qui va gérer l'indexation et la recherche de n'importe quelle entité, nous aurions pu définir une simple classe dérivant de la classe System.Attribute dans une assemblée séparée de notre domaine. Dans ce cas nous aurions quelque chose de relativement intrusif vis-à-vis de notre domaine. Il a fallu donc trouver une autre solution.
Comme nous l'avons vu le Framework développé doit connaitre la métadonnée. Ceci lui permet d'indexer le contenu de la propriété à l'exécution. C'est-à-dire qu'au moment du développement il nous est tout à fait possible de généraliser cette information en utilisant les génériques du .NET Framework 2. Comme il s'agit de métadonnée une seule chose est imposée c'est que notre classe hérite de System.Attribute
Le choix a donc été pris de définir une classe utilitaire dans la couche du domaine qui hérite de System.Attribute et qui va bien entendu nous servir de décorateur sur les propriétés des entités à indexer.
Sur l'image suivante vous pouvez voir un exemple de domaine pour une application auquel nous avons ajouté notre attribut SearchableAttribute qui est utilisé pour décorer les propriétés de la classe Post et Page:
 
Exemple de domaine avec un attribut SearchableAttribute

Exemple de domaine avec un attribut SearchableAttribute

 
La solution Visual Studio est organisée de la façon suivante :
 
La solution organisée sous la forme Domain Driven Development

La solution organisée sous la forme Domain Driven Development

 
Nous avons donc définit le nouvel attribut SearchableAttribute dans l'assemblé innoveo.Blog.Domain.
Pour information voici la description de l'organisation de notre solution, nous avons donc :
  • innoveo.Blog.DAL: la couche d'accès utilisant Euss un outil d'OR/M
  • innoveo.Blog.Domain: la couche définissant les différentes entités de notre domaine d'application
  • innoveo.Blog.Services: la couche exposant les différents services métier
  • innoveo.Blog.Web: la couche applicative web permettant de définir les contrôles web mais aussi les services web exposés
  • Blog: l'application web
Voici donc pour la solution qui va utiliser notre Framework d'indexation d'entités métier. Voyons maintenant de plus prêt notre Framework.
Tout d'abord voici le diagramme de classes :
 
Diagramme de classes du Framework

Diagramme de classes du Framework

 
Le rôle de chaque classe de notre Framework est le suivant :
  • EntityIndexer permet de gérer un index et d'indexer les entités métier
  • EntitySearcher permet de chercher des entités métier
  • EntityDocument est utilisé par la classe EntityIndexer afin de gérer les Document Lucene.Net
  • IndexPath est une classe utilitaire permettant de spécifier ou sera sauvegarder l'index
Comme vous pouvez le voir sur le diagramme nous utilisons les génériques du .NET Framework 2 ceci afin de nous permettre de rechercher n'importe quel attribut décorant nos entités métier. Mais aussi pour que notre Framework ne soit pas dépendant d'un certain type d'entité. Cela lui apporte une grande flexibilité à l'utilisation puisqu'il peut grâce à cela indexer n'importe quelle propriété de type chaine de caractères de n'importe quel type d'entité. Et tout cela sans être intrusif dans notre domaine.
De plus il utilise la Réflexion afin de rechercher l'attribut dans les entités.
Maintenant que nous connaissons l'architecture de notre Framework il est temps de voir de plus près les détails de son implémentation.
 
» Démarrer une discussion
 
Discussion démarée par teddyalbina le 24/08/2008 à 11:41, 1 commentaire(s).