我在编辑和删除对象时遇到问题,我认为这是因为我没有在我的存储库类和我的 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/