1

私はアプリケーション (asp.net mvc) を開発しており、リクエストごとに ISession を使用しています (globa.asax では、Begin_Request イベントと End_Request イベントで Bind と Unbind を使用しています)。すべて正常に動作しますが、場合によっては (一部の要求) ISession (データベースとの接続) を使用する必要はありません。

すべてのプロセス要求で ISession エントリを作成する必要がある場合にのみ ISession を開く方法があるかどうかを知りたいです (すべてのリポジトリとトランザクションの一意のコンテキストと共有するため)。

私はペニー オークションの Web サイトを開発しています。サーバーには 1 秒あたりのリクエストが多く、接続が必要ない場合もあります。キャッシュを使用します。

ありがとう

乾杯

4

2 に答える 2

2

これを行うには、ActionFilter を使用できます。これは、あなたが説明したことを正確に行うために使用するものです。

public class UsingNhibernate : ActionFilterAttribute {
    private ISession nhSession;
    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        nhSession = NHHelper.OpenSession();
        nhSession.BeginTransaction();
        // set an accessible reference to your nhSession for access from elsewhere
        //   ((ApplicationController)filterContext.Controller).nHSession = nhSession; is what I do
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        try {
            if (filterContext.Exception == null && nhSession != null && nhSession.Transaction.IsActive)
                nhSession.Transaction.Commit();
            else if (nhSession != null && nhSession.Transaction.IsActive)
                nhSession.Transaction.Rollback();
        } catch (Exception ex) {
            if (nhSession != null && nhSession.Transaction.IsActive)
                nhSession.Transaction.Rollback();
            nhSession.Dispose();
            throw;
        }
        nhSession.Dispose();
        base.OnActionExecuted(filterContext);
    }
}

適切なコントローラー アクションごとに (またはすべてのアクションに適用するコントローラー レベルでも)、次のように UsingNhibernate アクション フィルターを追加するだけです。

[UsingNhibernate]
public ActionResult SaveSystemSetting(SystemAdminVM item) {
于 2010-09-13T21:21:55.900 に答える
2

セッションを開くことは、データベースへの接続を開くことを意味しないことに注意してください。この記事で説明したように、セッションを開くコストは非常に低くなっています。したがって、一般に、リクエストが必要のないときにセッションを開くことについては心配しません。基本的に、非常に軽量なオブジェクトを新しく作成しているだけです。

于 2010-09-14T11:11:57.330 に答える