ASP.NET MVC和NHibernate耦合

时间:2010-04-19 12:12:25

标签: asp.net-mvc nhibernate

我刚开始学习NHibernate。

在过去的几个月里,我一直在使用IoC / DI(结构图)和存储库模式,它使我的应用程序更加松散耦合,更容易测试。

当我将持久层切换到NHibernate时,我决定坚持使用我的存储库。目前我正在为每个方法调用创建一个新会话,但这当然意味着我无法从延迟加载中受益。

因此,我希望实现每个请求的会话,但这样做会使我的Web项目依赖于NHibernate(也许这不是一件坏事吗?)。我计划将ISession注入我的存储库,并创建和处理有关beginrequest / endrequest事件的会话(参见http://ayende.com/Blog/archive/2009/08/05/do-you-need-a-framework.aspx

这是一个好方法吗?据推测,如果没有在我的Web项目中引用NHibernate,我不能使用session-per-request吗?

让Web项目依赖于NHibernate提示我的下一个(几个)问题 - 为什么甚至打扰存储库?由于我的网络应用程序正在调用与存储库通信的服务,为什么不放弃存储库,只是在服务中添加我的NHibernate持久性代码?最后,是否真的需要拆分成这么多项目。 Web项目和基础架构项目是否足够?

我意识到我已经偏离了原来的问题,但似乎每个人似乎都对这些主题有自己的看法。有些人使用NHibernate的存储库模式,有些则没有。有些人将他们的映射文件与相关的类粘在一起,其他人则有一个单独的项目。

非常感谢, 本

3 个答案:

答案 0 :(得分:1)

我不会让业务逻辑依赖于NHibernate。我编写了一个(或多或少简单)类来将会话创建到上下文中:

using (TransactionService.CreateTransaction())
{
  // use repository here

  // rollback on exception, only commit when reach this last line:
  TransactionService.Commit();
}

你只是得到一个IDisposable,你不需要知道会话。

存储库获取访问会话的API。例如:

// example repository implementation
public Entity Get(Guid id)
{
  return SessionProvider.Session.Get<Entity>(id);
}

为了实现这一点,我将会话放入ThreadStatic变量,该变量在CreateTransaction中初始化并由SessionProvider.Session返回。

答案 1 :(得分:1)

看看S#arp Architecture。它可以满足您的所有需求,包括如何分离数据层(NHibernate),Web层和业务逻辑。

答案 2 :(得分:0)