我正在检查Linq for NHibernate 2.1以在ASP.NET MVC应用程序中使用,我正在尝试找出会话管理。作为第一个实验,我试图从Pro ASP.NET MVC Framework修改SportsStore应用程序。这个示例应用程序使用Linq to Sql,所以我认为这将是一个很好的练习。我有NHibernate 2.1访问数据库和非Linq查询工作正常。
在Linq to SQL中,我们可以从数据上下文和连接字符串创建一个IQueryable对象,该字符串可以传递和使用,而无需担心维护任何上下文。 例如,原始产品存储库代码的内容如下:
public IQueryable<Product> Products
{
get { (new DataContext(_connectionString)).GetTable<Product>();
}
并且应用程序使用返回的IQueryable来填充产品列表,检索产品详细信息等。
在NHibernate中Linq类似地使用数据上下文但不是连接字符串,而是提供了一个会话对象,当IQueryable正在使用时,该对象必须保留在范围内:
IQueryable<Product> products = new SportsStoreContext(session).Products;
所以我想知道如何在不对示例应用程序的结构进行太多暴力的情况下管理该会话。理想情况下,我想要一个解决方案,使我能够通过只进行本地更改,用NHibernate Linq将Linq替换为Sql代码。
NHibernate会话实现了IDisposable,大多数NHibernate示例使用using {}构造演示了会话管理,但这种策略在这里不起作用。 This thread讨论了一些不同的方法,S#arp Architecture和HybridSessionBuilder。是否有人使用这些用NHibernate Linq替换Linq到Sql?还有其他方法可以更好地运作吗?
**编辑 mausch说得对 - 接下来的常见方法是使用httpmodule。 NHibernate in Action描述了两种执行此操作的方法:每个请求的会话(p334)和每个会话的会话(p340)。后者允许您跨多个http请求重用持久化实例。除了mausch提供的链接之外,NHibernate in Action还提到了NHibernate Burrow,Castle ActiveRecord和Rhino Tools。
答案 0 :(得分:4)
IMO最简单的方法是使用httpmodule管理会话(每个请求的会话模式),然后使用依赖注入将ISession提供给控制器。
这几乎是the approach used by S#arp和others。
LINQ for NHibernate构建于“标准”NHibernate之上,因此所有会话管理模式仍然适用。
虽然没有这本书所以我不知道要改变多少......
答案 1 :(得分:0)
Rhino Commons也是一个解决方案。我在ASP.NET MVC应用程序中使用它可以正常工作。