asp.net-mvc - 确保您的 Repository 和 UnitOfWork 类共享相同的休眠 session 对象的正确方法是什么?

标签 asp.net-mvc nhibernate session ninject

我在编辑和删除对象时遇到问题,我认为这是因为我没有在我的存储库类和我的 unitofwork 类之间共享相同的 session 对象。我正在尝试找到一些有关将其连接起来的最佳方法的文档,因此我共享相同的 session 对象。

我在 mvc 网站中使用 ninject 作为我的 IOC 容器。

最佳答案

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

public UserRepository(ISession session)
{
    ...
}

这就是我设置绑定(bind)的方式:
kernel.Bind<ISession>().ToMethod(x => GetRequestSession()).InRequestScope();

因此,当需要 session 时,Ninject 将调用 GetRequestSession() 来检索 session 。函数实现如下:
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 session 存储在 HttpContext 项中。这是一个键值集合,可用于在处理一个请求期间存储和共享数据。

每个请求只创建一次 session ,并在请求期间重复使用。

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

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

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

关于asp.net-mvc - 确保您的 Repository 和 UnitOfWork 类共享相同的休眠 session 对象的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12649911/

相关文章:

nhibernate - 使用 NHibernate 按计数分组

nhibernate - 为什么 HQL 中的 NHibernate 简单选择到 SQLite 数据库不起作用?

jquery - 关于JSON和序列化的问题

javascript - 对 JavaScript 集合中的对象进行排序

asp.net-mvc - 如何在 asp.net mvc View 中验证日期时间格式时覆盖 "A value is required."?

c# - 嵌套 LINQ 查询问题

c# - 流利的 NHibernate "Could not resolve property"

node.js - NodeJS Passport session 序列化 - 将用户反序列化到 session 中?

c# - ASP.NET session 和 LINQ

java - hibernate - 在没有 session 的情况下获取命名查询字符串