为网页和Web服务保留NHibernate ISessionFactory最简单的方法是什么?

问题描述:

为网页和Web服务保留NHibernate ISessionFactory最简单的方法是什么?为网页和Web服务保留NHibernate ISessionFactory最简单的方法是什么?

我会进入Rhino Commons和Windsor这个和那个稍后。我正在寻找基本概念。

这是正确的吗?

我一直在试图找到如何尽可能简单地处理ISessionFactory的指导。我还在寻找一个可以在网页和Web服务中使用的解决方案。我见过的例子涉及到网页,从不涉及Web服务的主题。他们首先构建一个创建ISessionFactory的Httpmodule并将其存储在一个静态变量中(例如,Jeffery Palermo的HybridSessionBuilder(jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/) )或者在NHibernate的夏天(www.summerofnhibernate.com请参阅Session 13中的StaticSessionManager)我也注意到,尽管ISessionFactory实现了IDisposable,但似乎没有人会处理它,我想他们只是让垃圾收集器处理如果IIS被回收或网站变得空闲,会发生这种情况

如果所有这些都是真的,最简单的事情就是创建一些具有静态变量的类,该类用于存储ISessionFactory,这个类将被实例化并被网页和web服务使用,每次类被实例化时,我都会检查以确保静态ISessionFactory变量不为空。如果它为空,我重新创建它。因此,我通过在web应用程序中创建一个类的实例来保持ISessionFactory的活动状态,无论是Web页面还是Web服务。 ISessionFactory在静态变量中的事实意味着它由类的每个实例共享。由于会话工厂是线程安全的,这是可以的。只要我不分享ISESSIONS,我就是金。当没有人拥有这个公共类的实例时,静态变量不再被引用,并且垃圾回收会破坏ISessionFactory。

这是保持ISessionFactory存活的基本原理吗?

我认为你有它主要想通了。

没有人处理会议工厂的原因是,一般来说,你真的不想。构建会话工厂是一项非常昂贵的操作,可能需要很长时间,所以您希望尽可能长时间保持它。 .NET运行库实际上会创建一个HttpApplication的池,并可以随意创建/处理它们。因此,如果您可以将会话工厂存储在应用程序之外,则在AppDomain范围内,这是可取的,因为工厂将持续到域被回收为止。将会话工厂声明为静态会实现这一点,所以这就是为什么这样做的原因;看到MSDN docs on static classes:

静态构造函数只调用 一次,一个静态类在内存中保留 在其中您 程序驻留在 应用领域的寿命。

所以,如果你把会话工厂容器静,从来没有明确处理它,它会留在内存中,直到AppDomain被回收,最大化工厂实例的实用性和应用程序的性能。