vb.net - 将 NHibernate 与存储库模型一起使用的最佳方式

标签 vb.net nhibernate repository

我有一个存储库类,它定义了一些基本的 Get/Save/Delete 方法。在这些内部,我使用 NHibernate 来处理我的业务实体。例如:

Public Class SecurityRepositoryNHibImpl : Implements ISecurityRepository
    Public Function GetUser(ByVal UUID As System.Guid) As Entities.User Implements ISecurityRepository.GetUser
        Dim eUser As Entities.User
        Using session As ISession = NHibernateHelper.OpenSession()
            eUser = session.Get(Of Entities.User)(UUID)
        End Using
        Return eUser
    End Function
End Class

但是,在我的 User 类上,我有一些属性和其他对象的集合,理想情况下我希望延迟加载。但是,当然,ISession 是在存储库中创建和处理的,我想这就是为什么除此之外,当我尝试访问这些属性时,我会收到“无法初始化代理 - 没有 session ”错误。

在使用存储库时禁用延迟加载是我唯一的选择吗?或者是否有可能(或只是愚蠢)以某种方式将 session 纳入业务层的范围内?

我确实喜欢存储库模型,并且 NHibernate 在我身上不断发展(在尝试使其工作时经历了很多最初的挫折之后),那么你们大师们发现将它们一起使用的最佳方式是什么?

总的来说,我对 NHibernate 和存储库模型很陌生(在工作中我们仍然主要使用 VB6!),所以请原谅可能是一个愚蠢的问题。谢谢。

@mookid:谢谢老兄,这真的很有帮助,但我可能会让它打开一段时间。它是 WCF Web 服务的后端,所有功能都将是每次调用的上下文,因此每次调用的 session 生命周期都会很好。只是不确定如何让这样的事情在业务层工作,理想情况下我不希望业务对象必须直接与任何 NHibernate 类进行交互。我猜 NHibernate session 的某种包装器至少将它抽象出来......
嗯,你至少让我走上了正轨。

看起来这里的关键词是“工作单元”,网络上存在大量与 NHibernate 相关的资源。特别找Ayende's implementation在 Rhino Commons 中,以及他的应用程序架构网络广播 (no. 9 at Hibernating Rhinos) ,信息量很大。我最初很困惑,因为我虽然在业务层中放置了一个“工作单元”会混合关注点,but I was soon corrected.

最佳答案

创建您的 ISession 并将其明确地放置在您的存储库中,对于小型且非常简单的项目来说是可以的 - 但是,正如您所发现的,当您开始想要使用 NHibernate 支持的一些很酷的功能时,它就会变得很短。

您可能应该让 session 的生活方式由您的存储库之外的东西控制 - 例如如果您正在开发 ASP.NET Web 应用程序,您可能希望在 Web 请求期间保存当前请求中的 session (如果我没记错的话,HttpContext.Current.Items),然后在请求结束时提交和处置(或发生异常时回滚)。

我不知道在 ASP.NET 应用程序中控制 session 生活方式的最佳方法,但必须有某种方法可以在每个请求的开始和结束时调用代码。在 ASP.NET MVC 中,它可以通过从覆盖其 OnActionExecuting 的基本 Controller 派生所有 Controller 来轻松实现。和 OnActionExecuted方法。

关于vb.net - 将 NHibernate 与存储库模型一起使用的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/650617/

相关文章:

c# - 当用户尝试打开相同版本的新实例时,如何返回到已打开的应用程序?

c# - 是否可以创建一个通用的 Session.QueryOver<T>?

nhibernate - NHibernate:获取所引用抽象实体的具体类型

asp.net - NHibernate + ASP.NET + 在 View 中打开 session + L2Cache

vb.net - 处理表单是否会清除其所有元素?

c# - .Net 正则表达式货币

mysql - 使用文本框输入将用户名和密码插入到连接字符串VB

git - 我可以在同一个存储库中使用 git submodule 吗?

c# - 如何在表示 SQL Server 中身份字段的 POCO 上实现 ID 字段?

javascript - 使用 Javascript 获取用户的 Github 存储库列表