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. }

Inhoudsopgave Haut

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.

Nederlandse vertaling

U hebt gevraagd om deze site in het Nederlands te bezoeken. Voor nu wordt alleen de interface vertaald, maar nog niet alle inhoud.

Als je me wilt helpen met vertalingen, is je bijdrage welkom. Het enige dat u hoeft te doen, is u op de site registreren en mij een bericht sturen waarin u wordt gevraagd om u toe te voegen aan de groep vertalers, zodat u de gewenste pagina's kunt vertalen. Een link onderaan elke vertaalde pagina geeft aan dat u de vertaler bent en heeft een link naar uw profiel.

Bij voorbaat dank.

Document heeft de 06/12/2006 gemaakt, de laatste keer de 26/10/2018 gewijzigd
Bron van het afgedrukte document:https://www.gaudry.be/nl/bibliobrol-dao.html?_escaped_fragment_

De infobrol is een persoonlijke site waarvan de inhoud uitsluitend mijn verantwoordelijkheid is. De tekst is beschikbaar onder CreativeCommons-licentie (BY-NC-SA). Meer info op de gebruiksvoorwaarden en de auteur.

Referenties

  1. Bekijk - html-document Taal van het document:uk Core J2EE Patterns : Sun Developer Network, Data Access Object

Deze verwijzingen en links verwijzen naar documenten die geraadpleegd zijn tijdens het schrijven van deze pagina, of die aanvullende informatie kunnen geven, maar de auteurs van deze bronnen kunnen niet verantwoordelijk worden gehouden voor de inhoud van deze pagina.
De auteur Deze site is als enige verantwoordelijk voor de manier waarop de verschillende concepten, en de vrijheden die met de referentiewerken worden genomen, hier worden gepresenteerd. Vergeet niet dat u meerdere broninformatie moet doorgeven om het risico op fouten te verkleinen.

Inhoudsopgave Haut