NHibernate session management in ASP.NET MVC

后端 未结 5 1072
梦谈多话
梦谈多话 2020-12-23 10:19

I am currently playing around with the HybridSessionBuilder class found on Jeffrey Palermo\'s blog post:

http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-t

相关标签:
5条回答
  • 2020-12-23 10:37

    I wouldn't open and close sessions on each data request to NHibernate. I would use the Unit of Work libraries that many others suggest or do some more reading. NHForge.org is getting started and I believe that there are some practices on setting up NHibernate for a general web application.

    One of the "oh wow that's cool moments" that I've gotten from NHibernate was taking advantage of lazily loading collections during development. It was a neat experience being able to not have to do all those joins in order to display data on some associated object.

    By closing the session like this, the above scenario would not be possible.

    There might be something that is going on with transactions as well.

    0 讨论(0)
  • 2020-12-23 10:39

    With ASP.Net MVC you want to make sure the life of the session is maintained during the Action method on your controller, as once your controller has exited all your data should be collected. I am not sure if this mechanism will help with that.

    You might want to look into S#arp Architechure which is a set of libraries and guidance for building ASP.Net MVC application using nHibernate. http://code.google.com/p/sharp-architecture/

    0 讨论(0)
  • 2020-12-23 10:41

    You should not wrap your ISession in a using statement -- the point of passing the ISessionBuilder into the repository constructor (dependency injection) is that the calling code is responsible for controlling the life cycle of the ISession. By wrapping it in a using, Dispose() is called on the ISession and you won't be able to lazy load object members or persist it.

    We do something similar by just passing in an ISession to the repository constructor. Mr. Palermo's code, as I understand it, simply adds lazy initialization of the ISession. I don't think that's needed because why would you new up a repository if you're not going to use it?

    0 讨论(0)
  • 2020-12-23 10:42

    Just found a clean solution using Unity to inject a session per request:

    http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/nhibernate-sessions-in-aspnet-mvc.html

    0 讨论(0)
  • 2020-12-23 10:43

    This is the setup I used after researching this more. Seems to work great and doesn't have that annoying habit of creating an ISession on static file requests like most guides out there:

    http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

    0 讨论(0)
提交回复
热议问题