我一直在使用Fluent nHibernate / ASP.NET MVC构建一个应用程序 - 我已经挖掘并认为最合适的做法是保持'永久'SessionFactory打开,然后对每个请求使用会话到数据库。好的,听起来不错......
但是,我对如何实现这一点感到很困惑。我找到的所有东西都假定了一个完整的结构化框架,它使用了某种IoC容器系统......而且这对我目前所拥有的东西来说太先进了。有没有更简单的例子来说明如何实现这种设计?我看过Where can I find a good NHibernate and ASP.NET MVC Reference Application
甚至读过“ASP.NET MVC in Action”这本书,但它的例子比我想要实现的要复杂得多。我认为单例模型可以在'global.asax
'的Application_Start中工作,但这并没有产生我希望的结果。它会继续处理我的工厂,永远不会重新创建它。
答案 0 :(得分:5)
您可以将ISessionFactory
公开为单身人士:
public sealed class FactoryManager
{
private static readonly ISessionFactory _instance = CreateSessionFactory();
static FactoryManager()
{ }
public static ISessionFactory Instance
{
get { return _instance; }
}
private static ISessionFactory CreateSessionFactory()
{
// TODO: configure fluentnhibernate and create a session factory
}
}
现在您可以在代码中使用FactoryManager.Instance
:
using (var session = FactoryManager.Instance.OpenSession())
using (var tx = session.BeginTransaction())
{
// TODO: use the session here
tx.Commit();
}
答案 1 :(得分:2)
在全局MvcApplication类上创建一个静态GetSessionFactory方法。此方法在第一次调用会话工厂时初始化会话工厂,并将其存储为私有静态变量。在后续调用时,它只返回静态变量。
此方法还可以检查对象是否为空或处置并根据需要重新创建,但不应该发生,因为变量是静态的,因此,在应用程序的生命周期内保持活动状态。