websessionContext/currentsessionContextを使用して、怠zyな初期化isession
-
11-10-2019 - |
質問
Nhibernate 3で新しいプロジェクトを開始しており、WebsessionContextを使用してCruellentsessionContext APIを使用してISESSionオブジェクトを管理しようとしています。
以前のプロジェクトでは、私は常に自分自身を管理していたので、isessionオブジェクトが必要なときはいつでも作成してhttpcontext.itemsコレクションに保存します。非常に簡単ですが、ネイティブソリューション(currentsessionContext)を使用すると、この新しいプロジェクトに最適なオプションのようです。
オブジェクトを管理したとき、私は怠zyな初期化を行うことができました。つまり、すべてのリクエストではなく、すべてのリクエストではなくセッションを開くことができ、すべてを開くことでリソース/時間を無駄にすることを意味します。時間。
CurrentsessionContext APIでそれを行う簡単な方法はありますか?
これが私がこれを担当するhttpmoduleで使用しているコードです。
public class ContextualSessionModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
context.EndRequest += context_EndRequest;
}
public void Dispose()
{
}
private static void context_BeginRequest(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
var context = application.Context;
BindSession(context);
}
private static void BindSession(HttpContext context)
{
// Create a new session (it's the beginning of the request)
var session = SessionBuilderFactory.CurrentSessionFactory.OpenSession();
// Tell NH session context to use it
CurrentSessionContext.Bind(session);
}
private static void context_EndRequest(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
var context = application.Context;
UnbindSession(context);
}
private static void UnbindSession(HttpContext context)
{
// Get the default NH session factory
var factory = SessionBuilderFactory.CurrentSessionFactory;
// Give it to NH so it can pull the right session
var session = CurrentSessionContext.Unbind(factory);
if (session == null) return;
session.Flush();
session.Close();
}
}
編集
ディエゴはそれをかなり釘付けにしましたが、私はこれについてもう少し考えました、そして、私はそのコントロールを自分で実装した主な理由を思い出しました:トランザクション。
私はです オニオンアーキテクチャ Guy So My Domainオブジェクト(トランザクションを開始するタイミングを知っている人)は、インフラストラクチャにアクセスできないため、トランザクションを開始できません。
これを解決するために、私は怠zyな初期化を使用し、セッションを開くときは常にトランザクションを開始します。コミットは、リクエストが終了し、例外がキャッチされなかったときに発生します。これに加えて、クエリをするときでさえ、常にトランザクションを使用するというAyendeのアドバイスがあります。何かご意見は?
解決
そうではありません 直接 あなたの質問に答える、私は思う: なぜ?
セッションは軽量のオブジェクトです。使用しない場合、内部構造を初期化するだけですが、DB接続などは開きません。
少し時間/メモリを節約するために、静的オブジェクトのセッションを開くことを避けるためのいくつかの例(Googleのみ)があります。それ以外は、プロファイリングがパフォーマンスを傷つけていることを示していない限り、それだけの価値がないかもしれません。
更新:トランザクションのニーズについては、UnhaddinsでのCPBT実装をご覧ください。