加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 确保您的Repository和UnitOfWork类共享相同的nhi

发布时间:2020-12-16 07:18:41 所属栏目:asp.Net 来源:网络整理
导读:我有编辑和删除对象的问题,我认为它是因为我不是在我的存储库类和我的unitofwork类之间共享相同的会话对象.我试图找到一些关于连接它的最佳方法的文档,所以我共享相同的会话对象. 我在mvc网站上使用ninject作为我的IOC容器. 解决方法 我通常将会话设置为存储
我有编辑和删除对象的问题,我认为它是因为我不是在我的存储库类和我的unitofwork类之间共享相同的会话对象.我试图找到一些关于连接它的最佳方法的文档,所以我共享相同的会话对象.

我在mvc网站上使用ninject作为我的IOC容器.

解决方法

我通常将会话设置为存储库的依赖项,因此Ninject可以解析依赖项(ISession = NHibernate.ISession):

public UserRepository(ISession session)
{
    ...
}

这是我设置绑定的方式:

kernel.Bind<ISession>().ToMethod(x => GetRequestSession()).InRequestScope();

因此,当需要会话时,Ninject将调用GetRequestSession()来检索会话.该功能实现如下:

private static ISession GetRequestSession()
        {
            IDictionary httpContextItems = HttpContext.Current.Items;

            ISession session;
            if (!httpContextItems.Contains(MvcApplication.SESSION_KEY))
            {
                // Create an NHibernate session for this request
                session = MvcApplication.SessionFactory.OpenSession();
                httpContextItems.Add(MvcApplication.SESSION_KEY,session);
            }
            else
            {
                // Re-use the NHibernate session for this request
                session = (ISession)httpContextItems[MvcApplication.SESSION_KEY];
            }
            return session;
        }

NHibernate会话存储在HttpContext项中.这是一个键值集合,可用于在一个请求的处理过程中存储和共享数据.

会话仅在每个请求中创建一次,并在请求期间重新使用.

MvcApplication.SESSION_KEY只是我在Global.asax中定义的一个常量字符串,它能够从HttpContext存储和检索会话.会话工厂也位于global.asax中,并在启动时创建.

您的工作单元类也可以将ISession设置为依赖项,因此Ninject也将解析此依赖项,因此使用相同的会话.另一方面,您可能不需要工作单元,因为NHibernate的ISession实现本身已经是工作类的一个单元.

我不确定这是否是最佳做法,但它对我来说非常有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读