Bonjour,
Je développe une application Winform et j'utilise NHibernate pour l'accès aux données.
J'essaye architecturer mon application selon les préconisations de nos amis Sami Jabber ou Thomas Lebrun (CF Introduction au développement en couches) (Merci à eux au passage)
de manière à avoir :
- une couche présentation des données => Winform
- une couche de service qui propose de récupérer, mettre à jour des objets ou liste d'objets métiers (sans notion de session :erreur ?)
- une couche d'accès au données qui encapsule NHibernate.
Le problème c'est que lorsque dans ma couche de présentation j'utilise un objet métier par exemple Client , j'ai parfois (pas nécessairement) besoin d'accéder aux attributs d'objets référencés par cet objet Client par exemple Client.Commandes ou Client.Adresse.
Mais comme je suis hors transaction, NHibernate me renvoi une exception par exemple : "failed to lazily initialize a collection, no session or session was closed"
Dans ma méthode ClientDao.ClientById(int) je ne peux pas charger toutes les dépendences systématiquement sinon je risque de remonter une bonne partie de la base pour la moindre petite opération !
Est-ce que je dois donc avoir plusieurs méthodes en fonction des usages ?
par exemple :
ClientDao.GetClientById(int oid) // Charge l'objet avec seulement les attributs simples
ClientDao.GetClientById(int oid, bool getAdresse) // Charge l'objet et l'objet référencé Adresse
ClientDao.GetClientById(int oid, bool getAdresse, bool getCommandes) // charge l'objet complet Client et ses dépendances
Problème avec cette approche :
Dans une form j'utilise ClientDao.GetClientById(int oid, bool getAdresse) mais je souhaite obtenir des infos sur un objet référencé par Client.Adresse qui n'est pas chargé (Adresse référence un objet Etablissement).
Dois-je créer une nouvelle méthode sur ClientDao pour cet usage ?
A part créer une session (Nhibernate.ISession directement (entorse à la séparation) ou un wrapper de Session) dans ma couche de présentation qui me permettrai de charger des objets référencés à la demande, je ne vois pas comment faire sinon ça risque d'être un "joyeux bordel" dans mon DAO ; les programmeurs de la couche présentation ne seront pas vraiment quelle méthode prendre et/ou voudront accéder quelque fois à des objets non chargés (et obtiendront inévitablement une exception)...
Tout ceci est dû, je pense au fait que je travaille en mode "déconnecté" : ma couche de service charge des objets, les détache (ferme la session), travaille avec et éventuellement les ré-attache (les réinjecte dans une autre session par ex pour faire un SaveOrUpdate), dans ma couche de service je n'ai pas (encore) de notion de session.
N'hésitez pas à me répondre, si vous avez des conseils, des urls de tutoriaux et pour me dire comment vous faites de votre côté.
Fx
nb: Faisons abstraction ici du nommage "franglais" c'est pour essayer de mieux me faire comprendre
Partager