Bibliobrol : le DAO

Nous pouvons utiliser une base de données MS Access pour stocker les informations de notre application.

Ce choix présente deux avantages majeurs :

  • Les pilotes de la base de données sont normalement pris en charge par le système d'exploitation, même si la machine sur laquelle nous exécutons l'application n'est pas pourvue du logiciel MS Access. En effet, nous pouvons accéder à une base de données Access (le fichier portant l'extension .mdb) sans utiliser le logiciel Access.
  • Si nous utilisons un chemin relatif vers la base de données, l'application et la base de données peuvent se trouver sur un support de stockage amovible (disque dur externe, memory stick, lecteur mp3, etc.).

Si nous désirons partager une base de données en réseau, il nous faudra placer la base de données sur un répertoire partagé, et nous pourrons alors accéder simultanément aux données.

Le problème de ce genre de situation est qu'Access n'est pas le type de base de données idéal pour une utilisation simultanée par un grand nombre d'utilisateurs.
Nous pouvons résoudre certains problèmes en verrouillant les données accédées en modification pour gérer les accès concurrents, mais si l'application doit supporter un nombre d'utilisateurs simultané important il vaut mieux se tourner vers d'autres systèmes de gestion de bases de données (SGBD).

De plus, si un nouveau SGBD arrive sur le marché et est plus performant, nous ne désirons certainement pas recoder toute l'application.

Nous devons en outre prendre en compte la maintenance du code de l'application.

Pour toutes ces raisons, les accès au système de persistance doivent à tout prix être groupés et séparés du reste du code. Ni la vue, ni le modèle ne doivent savoir quel est le type de persistance employé. Il est dès lors tout à fait impensable d'accéder directement à une base de données depuis la vue (une fenêtre par exemple) ou le modèle propre (par exemple, un objet Ouvrage peut posséder la méthode sauverOuvrage(), mais ne connaît pas le système employé pour la sauvegarde).

Découplage du DAO

Comment rendre le code de notre application de gestion de media indépendant du système de persistance ?

Nous allons créer une classe abstraite DAOFactory. Lorsque nous nous adressons à cette classe, nous en utilisons en réalité une de ses implémentations concrètes. De cette manière, nous n'avons pas besoin de savoir à quelle classe concrète nous nous adressons.

Dans le cas de cet exemple, nous pouvons mettre en œuvre le pattern Singleton pour être certain de toujours travailler avec la même instance. Le constructeur (dont l'accès est réduit afin d'éviter d'instancier un nouvel objet) lit le fichier de configuration pour déterminer quel système de persistance utiliser, puis retourne un objet du type de persistance désiré.

Nous pouvons estimer gràce aux grasp patterns que c'est à cette classe que revient la responsabilité de déterminer quels sont les types de persistances disponibles. Nous maintiendrons donc cette information sous la forme d'une énumération (voir les énumérations en Java, ou les énumérations en C#), afin de nous assurer que les valeurs ne puissent être malencontreusement modifiées.

Nous avons vu que notre modèle contenait un certain nombre de classes, mais nous devons pouvoir stocker ces valeurs dans un système persistant. Nous allons donc créer une interface correspondant à chaque classe que nous désirons stocker dans notre persistance.

Nous devons donc déclarer dans notre classe abstraite DAOFactory des méthodes abstraites qui nous permettront d'accéder aux différentes implémentations de ces interfaces en fonction du système de persistance utilisé.

Les différentes interfaces définissent les méthodes auxquelles nous devons avoir accès.

  1. using be.gaudry.bibliobrol.config;
  2. using be.gaudry.bibliobrol.model.enums;
  3. using be.gaudry.bibliobrol.model.dao.config;
  4.  
  5. namespace be.gaudry.bibliobrol.model.dao
  6. {
  7. /// <summary>
  8. /// Provides concrete persistence classes for the persistent type defined in the user settings
  9. /// </summary>
  10. public abstract class DAOFactory
  11. {
  12.  
  13. #region singleton
  14. protected static DAOFactory instance = null;
  15. static readonly object threadLockObject = new object();
  16. protected DAOFactory() { }
  17. /// <summary>
  18. /// Get unique instance of <code>DAOFactory</code> providing methods to access to the persistent layer.
  19. /// </summary>
  20. public static DAOFactory Instance
  21. {
  22. get
  23. {
  24. lock (threadLockObject)
  25. {
  26. if (instance == null)
  27. {
  28. resetDAO();
  29. }
  30. return instance;
  31. }
  32. }
  33. }
  34. /// <summary>
  35. /// Resets unique instance of <code>DAOFactory</code> to use another persistent layer.<br />
  36. /// <b><u>Be extremly carefull with using this method :</u></b> if application is not restarted,
  37. /// inconsistent data between old persistent layer
  38. /// and new persistent layer will crash the application and the persistent storage.
  39. /// </summary>
  40. public static void resetDAO()
  41. {
  42. PERSISTENCE_TYPE persistentType = Config.PersistentType;
  43.  
  44. switch (persistentType)
  45. {
  46. //case PERSISTENCE_TYPE.SQLExpress:
  47. //case PERSISTENCE_TYPE.MySQL:
  48. // instance = new mysql.MySQLFactory();
  49. // break;
  50. //case PERSISTENCE_TYPE.Access:
  51. default:
  52. instance = new msaccess.AccessFactory();
  53. break;
  54. }
  55. }
  56. #endregion
  57.  
  58. #region getDao methods to implement
  59. public abstract AbstractDBConfig getDBConfig();
  60. public abstract IConfigDao getConfigDao();
  61. public abstract IPersonDao getPersonDao();
  62. public abstract IBrolDao getBrolDao();
  63. public abstract IMediaBrolDao getMediaBrolDao();
  64. public abstract ITaskDao getTaskDao();
  65. public abstract IExporterDao getExporterDao();
  66. public abstract IImporterDao getImporterDao();
  67. public abstract IStatsDao getStatsDao();
  68. public abstract ISerieDao getSerieDao();
  69. #endregion
  70. }
  71. }

Remarque

Nous ne sommes pas obligés de strictement créer une interface par classe dont nous assurons le stockage. Nous pouvons par exemple grouper certaines notions dans une même interface si cette opération n'altère pas la compréhension et la maintenance du code.

Réseaux sociaux

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.

 

Nuage de mots clés

8 mots clés dont 0 définis manuellement (plus d'information...).

Avertissement

Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.

 

Références

  1. Consulter le document html Langue du document: uk Core J2EE Patterns : Sun Developer Network, Data Access Object

Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.

 

Astuce pour imprimer les couleurs des cellules de tableaux : http://www.gaudry.be/ast-rf-450.html
Aucun commentaire pour cette page

© Ce document issu de l′infobrol est enregistré sous le certificat Cyber PrInterDeposit Digital Numbertection. Enregistrement IDDN n° 5329-8756
Document créé le 06/12/06 03:35, dernière modification le Vendredi 17 Juin 2011, 12:11
Source du document imprimé : http:///www.gaudry.be/bibliobrol-dao.html
St.Gaudry©07.01.02
Outils (masquer)
||
Recherche (afficher)
Recherche :

Utilisateur (masquer)
Apparence (afficher)
Stats (afficher)
15838 documents
455 astuces.
550 niouzes.
3107 definitions.
447 membres.
8121 messages.

Document genere en :
0,14 seconde

Mises à jour :
Mises à jour du site
Citation (masquer)
Celui qui aime la lecture possède tout à sa portée.

William Godwin
 
l'infobrol
Nous sommes le Mardi 23 Mai 2017, 22:30, toutes les heures sont au format GMT+1.00 Heure, heure d'été (+1)