2009-06-10 8 views
1

Je suis vraiment aux prises avec NHibernate ici. J'essaie de garder mon assembly DAL très générique, pour qu'il fonctionne dans un contexte web, dans WCF et dans WinForms/WPF. Mon problème ici est les sessions.Sessions NHibernate: Combien? Quand créer? Quand fermer?

Lazy-chargement est bon, et quelque chose que je veux vraiment, mais après la session avec laquelle vous avez chargé l'objet est fermé, vous ne pouvez plus charger paresseux. Cela s'avère être une affaire énorme pour moi, puisque je ne sais pas dans quelle portée je devrais commencer/terminer mes sessions.

J'ai vu beaucoup de gens les démarrer sur HttpContext.Begin et les terminer sur .End, mais ce n'est pas faisable pour moi, car je ne veux pas que mon assembly soit lié à System.Web ou soit lié être appelé dans un HttpContext. Une autre option consisterait à conserver une seule session pour l'ensemble du cycle de vie de l'assemblage DAL. Quels sont les avantages et les inconvénients de cette approche? L'assemblage fonctionnera principalement comme un backend dans un site Web, mais aussi faire du travail pour une application WinForms.

Tout preneur? :)

[EDIT] Une autre option pour moi serait d'écrire mes propres collections proxy par chargement paresseux, qui à leur tour ouvrirait une nouvelle session et récupèrerait toutes les données que la collection devrait contenir. Des commentaires sur cette approche?

Répondre

3

Dans notre système, nous avons le concept d'unité de travail. Une unité de travail pour nous est une opération unique contre le système. Par exemple retirer de l'argent d'un compte ou déposer de l'argent dans un compte serait une seule unité de travail. La classe d'unité de travail enveloppe la session NHibernate (et quelques autres choses), puis nos référentiels fonctionnent par rapport à l'unité de travail actuelle (via le stockage des threads).

En termes de ce que vous essayez de faire, nous pourrions alors faire ce qui suit ...

  • Pour WCF, nous avons un attribut UnitOfWorkContext que nous appliquons à une opération qui est responsable de début/fin l'unité de travail.

  • Pour WinForms nous aurait juste le présentateur début/fin une unité de travail

  • Pour WebContext nous faire la même chose dans HttpContext.Begin et .End

+0

Sonne bien. Je pensais quelque chose comme ça aussi, mais que se passe-t-il si le "Unité de travail" peut être 3x "Retrait d'argent" + 1x "Dépôt d'argent"? :) – cwap

+0

Je ne suis pas sûr de comprendre ce que vous voulez dire exactement. Vous voulez dire qu'ils retirent et déposent de l'argent en même temps? Dans ce cas, je créerais probablement une nouvelle opération qui appelle les deux opérations et est enveloppée dans une seule unité de travail. Une bonne façon de penser à une unité de travail est qu'elle devrait envelopper tout ce dont vous avez besoin pour annuler une opération afin que vous puissiez faire un seul UnitOfWork.Rollback(). –

+0

Cela prend tout son sens. J'ai juste peur que je me retrouve avec une énorme quantité d'unités de travail. Comment cela fait-il face à votre expérience? – cwap