バックグラウンド
nhibernate セッション管理に関するあらゆる種類のブログとドキュメントを読みました。私の問題は、winforms と webforms の両方に必要なことです。そうです、winforms (windows .exe) と webforms (asp.net web) アプリケーションの両方で同じデータ レイヤーを使用しています。作業単位パターンについて少し読んだことがあり 、winforms に適しています。nhibernate セッションを HttpRequest.Current.Items に格納することは、Web アプリに適した方法のようです。しかし、コンボ取引はどうですか?同じ nhibernate データ レイヤーを使用する必要がある Web アプリ、Windows アプリ、および WCF サービスがあります。では、私の質問に戻ります...
私はこのデザインを使用する予定です: NhibernateBestPracticesのように私の Web アプリで:
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() が正しいことを理解していれば、nhibernate セッションがメイン アプリケーション スレッドの一部として保存されるため、Windows アプリの全期間にわたってセッションを開いたままにできます。また、休止状態のセッションを長時間開いたままにしておくことについて、あらゆる種類の悪いことを聞いたことがありますが、設計上、長時間開いたままにすることは意味がないことを知っています。私の仮定がすべて正しければ、上記のコード行はノー、ノーです。
これらすべてを考慮して、上記の行を、Windows アプリでより頻繁に nhibernate セッションを破棄するものに置き換えたいと思います。HttpRequest の有効期間に似たもの。nhibernate セッション (またはトランザクション) とそれをいつ開いて閉じるかを Windows クライアントに任せたくありません。これを自動的にトリガーしたいと思います。
質問
したがって、nhibernate セッションを Windows アプリのどこに保存すれば、データベース要求ごとに (つまり、クライアントが DB を呼び出すたびに) トランザクションを自動的に開始および終了できますか (つまり、クライアント以外のもの)。 )?
**更新**
作業単位パターンを実装する方法に関する 2 つのリンクを次に示します。
http://msdn.microsoft.com/en-us/magazine/dd882510.aspx
http://www.codeinsanity.com/2008/09/unit-of-work-pattern.html