MVC 中引导 NHibernate 的正确方法

发布于 2024-09-18 13:04:13 字数 983 浏览 5 评论 0原文

我需要在 MVC 中设置会话管理。这样做的正确方法是什么? 如何使用结构图在 mvc 中设置 nhibernate 会话管理,这样我就不会得到:

会话已关闭 或者 在多个线程中使用单个会话可能是一个错误。

我当前的配置是: 在 GlobalAssax 中:

protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
        Bootstrapper.ConfigureStructureMap();
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

    }

在我的 BootStrapper 中,我执行以下操作:

var cfg = NHibernateManager.Configuration(assembly);
For<Configuration>().Singleton().Use(cfg);
For<ISessionFactory>().Singleton().Use(cfg.BuildSessionFactory());
For<ISession>().HttpContextScoped().Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());

将 ISession 注入到我在应用程序层中使用的存储库中。

编辑:如果我这样做会发生什么?: For().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest)).Use(ctx => ctx.GetInstance().OpenSession());

I need to setup session management in MVC. what is the correct way of doing so?
How to setup nhibernate session management in mvc using structuremap so I don't get:

Session is closed
or
Using a single Session in multiple threads is likely a bug.

My current configuration is:
in GlobalAssax:

protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
        Bootstrapper.ConfigureStructureMap();
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

    }

in my BootStrapper I do:

var cfg = NHibernateManager.Configuration(assembly);
For<Configuration>().Singleton().Use(cfg);
For<ISessionFactory>().Singleton().Use(cfg.BuildSessionFactory());
For<ISession>().HttpContextScoped().Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());

I Inject ISession into repositoryes that I use in application layer.

Edit: What happens if I do this?:
For().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest)).Use(ctx => ctx.GetInstance().OpenSession());

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泪之魂 2024-09-25 13:04:13

您是否为会话添加了处理?

//In Global.asax.cs
protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

否则它看起来是正确的。

Have you added a dispose for the session?

//In Global.asax.cs
protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

Otherwise it looks correct.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文