2010-07-16 4 views
2

Je vois qu'il ya 2 scénarios possibles quant à la gestion des sessions:Comment gérer les sessions NHibernate dans une application ASP.NET WebForms?

  1. Ouvrir une seule ISession par demande. Ouvrez-le au démarrage de la requête et fermez-le à la fin de la requête.
  2. Ouvrir une ISession par «unité de travail» conceptuelle. De nombreuses sessions sont créées pour une demande.

L'approche n ° 1 est celle que je suis en train de faire. Cela m'inquiète un peu car, même si cela fonctionne, c'est un peu difficile à déboguer. Par exemple, j'ai un objet qui n'est pas sauvegardé (même si je l'ai commandé) et j'ai du mal à le déboguer car il se passe BEAUCOUP de choses pendant un cycle de vie de requête complet.

L'approche n ° 2 semble être la meilleure pratique standard (pas sûr de ASP.NET) et je suis sûr que c'est plus facile à déboguer. Le problème que je vois concerne la communication entre sessions. Par exemple: Ma classe Page contient une référence à l'utilisateur, qui est un objet persistant. La plupart des opérations reçoivent l'utilisateur en tant que paramètre. Comme l'utilisateur appartient à une session différente, je ne peux pas le passer en paramètre.

Je suis partial à # 2, mais je ne sais pas si c'est la meilleure pratique, ni comment faire face à l'objet intersession.

Merci.

+0

Pourquoi est-il difficile de déboguer? – Paco

Répondre

1

La plupart des personnes effectuent une session par demande pour les raisons que vous avez esquissées et pour plus de simplicité. Toutefois, vous pouvez ouvrir et valider des transactions pour chaque "unité de travail". Donc vous aurez beaucoup de transactions pour chaque session. (Il est également pratique courante de s'assurer que lorsque la transaction est validée, la session est vidée en même temps).

Par exemple, après avoir cliqué sur le bouton Enregistrer, ouvrez et validez une transaction.

La session prendra soin de garder une trace de toutes vos entités. La transaction prendra soin de rincer à la base de données si nécessaire.

Avec cette configuration, il devrait être plus facile de déboguer votre problème.

0

Vous trouverez peut-être NHibernate Burrow utile, ou au moins intéressant à cet égard, car il est conçu pour aider à la gestion de session dans les applications ASP .NET, implémentant le concept d'une «conversation longue durée» qui couvre plusieurs demandes.

1

Pour le projet ASP.NET sur lequel je travaille actuellement, j'utilise une combinaison de ces approches.

J'ouvre un ISession au début d'une requête et je le ferme à la fin de la requête, comme vous le faites avec votre première approche, et j'utilise la session pour charger les entités qui doivent rester attachées à une session la durée de la demande. Cependant, lorsque j'ai besoin d'enregistrer, de mettre à jour ou de supprimer une entité, je crée un nouvel objet transitoire et le passe à un nouvel ISession, distinct de celui lié à la requête. Pour les unités de travail supplémentaires, je crée des sessions supplémentaires.

0

Je pense que votre vraie question est pourquoi je ne peux pas obtenir mes objets à enregistrer.

Même si vous utilisez un seul ISession, vous devez toujours vider la session ou valider la transaction pour que certaines actions Enregistrer/Mettre à jour/Supprimer soient validées.

Questions connexes