我刚刚开始学习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中使用存储库模式,有些人不使用,有些人将他们的映射文件与相关的类结合在一起,另一些人为此有一个单独的项目。
非常感谢,本
发布于 2010-04-19 20:21:34
我不会让业务逻辑依赖于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返回。
发布于 2010-04-20 04:18:59
看看S#arp Architecture吧。它可以满足您的所有需求,包括如何分离数据层(NHibernate)、web层和业务逻辑。
发布于 2010-04-19 22:02:43
您可能需要查看TransactionScope类:
http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx
https://stackoverflow.com/questions/2667220
复制相似问题