【问题标题】:Managing NHibernate Session in an Onion Architecture在洋葱架构中管理 NHibernate 会话
【发布时间】:2012-07-31 17:57:19
【问题描述】:

我正在尝试设置 NHibernate 来处理每个 Web 请求的会话。我有一个项目在使用我的任何存储库时初始化我的会话。我想知道管理每个 Web 请求的会话的最佳方式。因为我的架构是解耦的,所以我想避免在我的 Web 项目中打开会话并关闭会话。有没有一种好方法来处理这个问题,而不需要 web 项目知道 NHibernate 的存在?

这是我的请求流程:

Web 请求 -> ASP.NET MVC 3 -> 控制器 -> 服务 -> 存储库(打开会话) -> NHibernate -> 数据库 -> 回到 MVC 并退出。

【问题讨论】:

  • 但它是每(http)请求的会话...为什么要从网络项目中隐藏它?

标签: asp.net-mvc-3 nhibernate onion-architecture


【解决方案1】:

看看 S#arp 架构。它是一个包装 NHibernate 并为您提供此功能的框架,以及一些其他功能。您也可以使用 Castle Windsor 或 Ninject 等依赖注入容器来执行此操作。 (S#arp 使用温莎城堡)。

如果您想自己执行此操作,则需要创建一个HttpModule,以便在每个 Web 请求的开始和结束时为您打开和关闭会话。在请求开始时,模块会打开一个会话,并将其隐藏在HttpContext.Items 中,这是每个网络请求的存储。您的存储库将在处理请求时从此处获取会话。 (对于干净的设计,创建一个存储库使用的接口ISessionManager,以及一个访问每个请求存储的实现。然后它是可单元测试的。)最后,模块将在请求结束时刷新并关闭会话.我曾在一个 NHibernate 项目中这样做过,虽然它具有教育意义,但工作量很大。

S#arp 是一个大型框架,它规定了很多应用程序结构。如果您不想走那么远,请查看温莎城堡,为您清晰地抽象出来。您需要做的(或多或少)是配置容器以使用每个请求的 NHibernate 会话对象作为构造函数参数来实例化存储库。如果你真的想学习如何,构建自己的 HttpModule,但我建议在生产中使用框架。

【讨论】:

  • 我认为在这一点上滚动我自己是最好的路径。我的架构基于此:blog.tonysneed.com/2011/10/08/…,但我不确定如何将其插入到我从该页面上找到的源中获得的 SessionHelper 类中。顺便说一句,我将连接字符串注入到 SessionHelper 类中。我确实认为 HttpModule 是要走的路。您能提供更多帮助吗?
  • 我真的建议从一开始就使用 DI 容器。当然,您仍然可以构建自己的 HttpModule,或者您选择的任何方法。如果您以前没有使用过 DI,则有一些学习曲线,但它一点也不差。 DI 是一个非常明智的东西,它确实可以帮助您将自己编程到一个角落。它使一切都保持松散耦合,这就是洋葱架构的重点。有大量关于将 DI 与 MVC 和 NHibernate 结合使用的博客文章。祝你好运!
  • 我的整个框架都使用 Ninject 作为我的 DI。使用您的答案,我能够准确地理解我在寻找什么。我最终遵循此ben.onfabrik.com/posts/yet-another-session-per-request-post 作为根据请求设置会话的基础。我目前正在学习如何让 Ninject 注入到 ActionFilters 中,这样我就可以注入我的 UnitOfWork 实现。再次感谢您的意见和帮助!
【解决方案2】:

这是一篇很棒的文章,如何使用 IoC 容器 (Castle Windsor) http://blog.xelibrion.com/journal/2011/4/16/nhibernate-session-management-in-aspnet-mvc-application.html实现每个请求的会话数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 2014-10-15
    • 1970-01-01
    • 2014-06-22
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多