首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在存储库模型中使用NHibernate的最佳方法

在存储库模型中使用NHibernate的最佳方法
EN

Stack Overflow用户
提问于 2009-03-16 14:17:01
回答 1查看 3.5K关注 0票数 8

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

代码语言:javascript
复制
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

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

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

我确实喜欢存储库模型,而且NHibernate正在我身上(在经历了许多最初的挫折之后),所以您的专家们找到了什么最好的方法来一起使用它们呢?

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

@mookid:谢谢,伙计,这真的很有帮助,但我可能会把它开久一点。它是WCF web服务的后端,所有的功能都是每次调用的上下文,所以每次调用的会话生活都会很好。只是不知道如何在业务层中工作,理想情况下,我不希望业务对象必须与任何NHibernate类直接接口。我想NHibernate会话的某种包装器至少会把它抽象掉.嗯,你至少让我走上了正轨。

看起来这里的关键词是“工作单位”(Unit),与NHibernate相关的大量资源存在于网络上。特别是寻找艾因德的实施在犀牛公域,和他的应用架构网络广播(冬眠犀牛第9号),非常丰富。我最初感到困惑是因为我认为在业务层中添加一个“工作单元”是在混合关注点,但我很快就被纠正了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-03-16 14:38:01

创建ISession并在存储库中显式地配置它对于小型和非常简单的项目来说是可以的,但是,正如您已经发现的那样,当您开始使用NHibernate支持的一些很酷的特性时,它就会变得很短。

您可能应该让会话的生活方式由存储库之外的东西控制--例如,如果您正在执行ASP.NET web应用程序,您可能希望在web请求的持续时间内保存当前请求中的会话(如果我记得正确的话),然后在请求结束时提交和释放(如果出现异常,则将其回滚)。

我不知道在ASP.NET应用程序中控制会话生活方式的最佳方法,但是必须有某种方法在每个请求的开始和结束时调用代码。在ASP.NET MVC中,可以很容易地从覆盖其OnActionExecutingOnActionExecuted方法的基本控制器中派生出所有控制器。

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

https://stackoverflow.com/questions/650617

复制
相关文章

相似问题

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