在控制器和存储库的上下文中很难使用 Nhibernate 会话

Posted

技术标签:

【中文标题】在控制器和存储库的上下文中很难使用 Nhibernate 会话【英文标题】:Having a hard time with Nhibernate Sessions in the context of a Controller and Repository 【发布时间】:2011-10-22 15:09:55 【问题描述】:

我尝试使用 Nhibernate 和 Structuremap 以及存储库模式构建 ASP.NET MVC 应用程序。

通过我对该项目的初步处理和随后的阅读,我希望将 Nhibernate 会话限制在存储库中,并将存储库限制在控制器中。但同时,关于事务,我想将其与存储库方法分开(即我只想调用 session.Save())。

但似乎需要控制器知道会话,以便我可以在任何控制器操作之前对会话执行任何事务设置,并在操作之后使用类似的东西(即 ActionFilterAttribute 方法 BeforeExecution 或MvcApplication 中的 AfterExecuted 或 BeginRequest/EndRequest 事件。

所以在我看来,我必须将当前的 NHibernate Session 提供给 Controller 和 Repository,这样当控制器上发生某些操作/结果时我可以对 Session 采取行动。

这是我能解决这个问题的唯一方法吗?

我已经阅读了 Ayende 的博客,以及各种不同的方法来解决这个问题,但在使用存储库模式的情况下,这似乎是必须的。我希望能够将 Nhibernate / StructureMap 设置为最可插入的方式,因此除了为特定项目定义 FluentNhibernate 配置外,将其添加到另一个 MVC 项目的接线非常少。

【问题讨论】:

我有点不清楚为什么控制器在这种情况下需要会话 - 你是说你只是希望控制器能够建立事务范围? 【参考方案1】:

没关系。您需要在请求开始时打开会话并在请求结束时关闭它。

【讨论】:

以上是关于在控制器和存储库的上下文中很难使用 Nhibernate 会话的主要内容,如果未能解决你的问题,请参考以下文章

使用 NHibernate 和上下文更改数据库设计分层应用程序

在 Mvc 5、EF6、Visual Studio 2013 中使用存储库的脚手架控制器

带有现有存储库的 ASP.NET mvc 脚手架并将 POCO 映射到视图模型

没有存储库的建议数据访问模式

spring-data-cassandra 存储库的多个键空间支持?

在 XCode 中清除存储库的历史列表