背景
我已经阅读了有关 nhibernate 会话管理的各种博客和文档。我的问题是,winforms 和 webforms 都需要它。没错,我在 winforms (windows .exe) 和 webforms (asp.net web) 应用程序中都使用了相同的数据层。我已经阅读了一些有关工作单元 模式的信息,并且是 winforms 的不错选择。在 HttpRequest.Current.Items 中存储休眠会话似乎是 Web 应用程序的好方法。但是组合交易呢?我有 Web 应用程序、Windows 应用程序和 WCF 服务,它们都需要使用相同的休眠数据层。所以回到我的问题...
我打算在我的网络应用程序中使用这种设计: NhibernateBestPractices ,如下所示:
private ISession ThreadSession {
get {
if (IsInWebContext()) {
return (ISession)HttpContext.Current.Items[SESSION_KEY];
}
else {
return (ISession)CallContext.GetData(SESSION_KEY);
}
}
set {
if (IsInWebContext()) {
HttpContext.Current.Items[SESSION_KEY] = value;
}
else {
CallContext.SetData(SESSION_KEY, value); // PROBLEM LINE HERE!!!
}
}
}
问题
在我的 Windows 应用程序中使用此代码时遇到的问题是行
CallContext.SetData(SESSION_KEY, value);
如果我理解 CallContext() 正确,这将使会话在我的 Windows 应用程序的整个生命周期中保持打开状态,因为它将休眠会话存储为主应用程序线程的一部分。而且我听说过关于保持休眠会话打开时间过长的各种不好的事情,我知道从设计上讲,保持打开时间很长并不意味着。如果我所有的假设都是正确的,那么上面的代码行是不,不。
鉴于这一切,我想用会在 Windows 应用程序中更频繁地破坏休眠会话的东西替换上面的行。类似于 HttpRequest 的生命周期。我不想让 Windows 客户端知道休眠会话(或事务)以及何时打开和关闭它。我希望它自动触发。
问题
那么,我在哪里可以将 nhibernate 会话存储在 Windows 应用程序中,这将允许我(即客户端之外的其他东西)自动开始和结束每个数据库请求的事务(即,每当客户端调用数据库时) )?
**更新**
这里有 2 个关于如何实现工作单元模式的链接
http://msdn.microsoft.com/en-us/magazine/dd882510.aspx
http://www.codeinsanity.com/2008/09/unit-of-work-pattern.html