在控制器和存储库的上下文中很难使用 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 映射到视图模型