2012-07-31 2 views
1

J'essaie de configurer NHibernate pour gérer mes sessions par requête web. J'ai un projet qui initialise ma session lorsque l'un de mes dépôts est utilisé. Je voudrais connaître la meilleure façon de gérer ma session pour chaque requête web. Parce que mon architecture est découplée, je voudrais éviter l'ouverture de la session et la fermeture de la session dans mon projet web. Existe-t-il un bon moyen de gérer cela sans que le projet web ne soit au courant de l'existence de NHibernate?Gestion de la session NHibernate dans une architecture Onion

Ceci est mon flux de demande:

Demande Web -> ASP.NET MVC 3 -> Controller -> Service -> Dépôt (Ouvrira session) -> NHibernate -> Base de données -> Retour à la MVC et à l'extérieur.

+0

Mais il est session per- demande (http) ... pourquoi voudriez-vous cacher à partir du Web projet? – dotjoe

Répondre

2

Découvrez l'architecture S # arp. C'est un framework qui enveloppe NHibernate et fournit ceci pour vous, ainsi que d'autres fonctionnalités. Vous pouvez également le faire avec un conteneur d'injection de dépendances comme Castle Windsor ou Ninject. (S # arp utilise Castle Windsor).

Si vous voulez faire cela par vous-même, vous devez créer un HttpModule pour ouvrir et fermer la session au début et à la fin de chaque requête Web. Au début d'une requête, le module ouvrait une session et la stockait dans le HttpContext.Items, qui est un stockage par requête Web. Vos dépôts obtiendraient la session d'ici tout en traitant la demande. (Pour une conception propre, créez une interface ISessionManager utilisée par les référentiels et une implémentation qui accède au stockage par requête, puis testable à l'unité.) Enfin, le module videra et fermera la session à la fin d'une requête. Je l'ai fait une fois sur un projet NHibernate, et même si c'était éducatif, c'était beaucoup de travail. S # arp est une grande structure qui dicte une grande partie de la structure de l'application. Si vous ne voulez pas aller aussi loin, jetez un coup d'œil à Castle Windsor pour vous en faire abstraction. Tout ce que vous devez faire (plus ou moins) est de configurer le conteneur pour instancier les dépôts avec un objet de session NHibernate par requête en tant que paramètre constructeur. Si vous voulez vraiment apprendre comment, créez votre propre HttpModule, mais je recommande d'utiliser un framework en production.

+0

Je pense que rouler le mien est le meilleur chemin pour moi à ce stade. J'ai basé mon architecture sur ceci: http://blog.tonysneed.com/2011/10/08/peeling-back-the-onion-architecture, mais je ne suis pas exactement sûr comment brancher ceci dans la classe de SessionHelper I avoir de la source trouvée sur cette page. J'injecte ma chaîne de connexion dans la classe SessionHelper btw. Je pense que HttpModule est le chemin à parcourir. Pourriez-vous offrir plus d'aide? –

+0

Je suggère vraiment d'utiliser un conteneur DI depuis le début. Vous pouvez bien sûr encore construire votre propre HttpModule, ou n'importe quelle approche que vous choisissez. Si vous n'avez jamais utilisé DI auparavant, il y a une courbe d'apprentissage, mais ce n'est pas mal du tout. DI est une chose très sensée, et cela vous aide vraiment à vous programmer dans un coin. Il garde tout faiblement couplé, ce qui est le point de l'architecture de l'oignon. Il y a beaucoup de posts sur l'utilisation de DI avec MVC et NHibernate. Bonne chance! –

+0

J'ai tout mon cadre enveloppé en utilisant Ninject comme mon DI. En utilisant votre réponse, j'ai été capable de comprendre exactement ce que je cherchais. J'ai fini par suivre ce http://ben.onfabrik.com/posts/yet-another-session-per-request-post comme base pour configurer ma session par demande. J'apprends actuellement comment obtenir Ninject pour Injecter dans ActionFilters afin que je puisse Injecter mon implémentation UnitOfWork. Encore une fois, merci pour votre contribution et votre aide! –

Questions connexes