首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC和NHibernate耦合

ASP.NET MVC和NHibernate耦合
EN

Stack Overflow用户
提问于 2010-04-19 20:12:25
回答 3查看 422关注 0票数 2

我刚刚开始学习NHibernate。

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

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

因此,我希望实现session-per-request,但这样做会使我的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会提示我接下来的(几个)问题--为什么还要为存储库而烦恼呢?既然我的web应用程序调用的是与存储库对话的服务,为什么不丢弃存储库,直接在服务中添加我的NHibernate持久性代码呢?最后,真的有必要拆分成这么多项目吗?一个web项目和一个基础设施项目就足够了吗?

我意识到我已经偏离了我最初的问题,但似乎每个人对这些话题都有自己的看法。有些人在NHibernate中使用存储库模式,有些人不使用,有些人将他们的映射文件与相关的类结合在一起,另一些人为此有一个单独的项目。

非常感谢,本

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-19 20:21:34

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

代码语言:javascript
复制
using (TransactionService.CreateTransaction())
{
  // use repository here

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

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

存储库获取一个API来访问会话。例如:

代码语言:javascript
复制
// example repository implementation
public Entity Get(Guid id)
{
  return SessionProvider.Session.Get<Entity>(id);
}

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

票数 1
EN

Stack Overflow用户

发布于 2010-04-20 04:18:59

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

票数 1
EN

Stack Overflow用户

发布于 2010-04-19 22:02:43

您可能需要查看TransactionScope类:

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2667220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档