1

例えば。私のセッションファクトリはMyDomain.SessionProviderクラスにあります。セッションを開くことができますusing ISession session = SessionProvider.Instance.OpenSession()

ステップ:SessionProvider.cs

public static SessionProvider Instance { get; private set; }
        private static ISessionFactory _SessionFactory;

        static SessionProvider()
        {
            var provider = new SessionProvider();
            provider.Initialize();
            Instance = provider;
        }

        private SessionProvider()
        {

        }

        private void Initialize()
        {
            string csStringName = "ConnectionString";
            var cfg = Fluently.Configure()
               //ommiting mapping and db conf.

                .ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
                .BuildConfiguration();
            _SessionFactory = cfg.BuildSessionFactory();

        }

        public ISession OpenSession()
        {
            return _SessionFactory.OpenSession();
        }

        public ISession GetCurrentSession()
        {
            return _SessionFactory.GetCurrentSession();
        }

ステップ:Global.asax.cs

public static ISessionFactory SessionFactory { get; private set; }

アプリケーション開始

SessionFactory = SessionProvider.Instance.OpenSession().SessionFactory;

App_BeginRequest

var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);   

EndRequest破棄セッション

var session = CurrentSessionContext.Unbind(SessionFactory);
session.Dispose();

Step3.HomeController 次のような現在のセッションを使用する必要があります

var session = SessionProvider.Instance.GetCurrentSession();
using (var tran = session.BeginTransaction())
{
   //retrieve data from session
}

さて、descのように私のコントローラーでデータを取得しようとしています。ステップ3で。セッションが閉じられたというエラーメッセージが表示されました。global.asax内のApplication_EndRequestブロックを削除しようとしましたが、トランザクションがセッションでラップされましたが、成功しませんでした。それでも同じエラー。

2番目/副次的な質問:このパターンは広く受け入れられていますか、それともmvcコントローラーのカスタム属性内にラップする方が良いですか?ありがとう。

更新:現在のセッションをインラインでインスタンス化しようとしたときにコントローラーで

var session = SessionProvider.Instance.GetCurrentSession();

次のエラーが発生します:

**Connection = 'session.Connection' threw an exception of type 'NHibernate.HibernateException'**

**base {System.ApplicationException} = {"Session is closed"}**
4

2 に答える 2

2

ここここにいくつかの単純で簡単な実装があり、ここにいくつかのコードがあります
私は、すべてをシンプルでクリーンに保つためのAyendeのアプローチが好きです。

public class Global: System.Web.HttpApplication
{
    public static ISessionFactory SessionFactory = CreateSessionFactory();

    protected static ISessionFactory CreateSessionFactory()
    {
        return new Configuration()
            .Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "hibernate.cfg.xml"))
            .BuildSessionFactory();
    }

    public static ISession CurrentSession
    {
        get{ return (ISession)HttpContext.Current.Items["current.session"]; }
        set { HttpContext.Current.Items["current.session"] = value; }
    }

    protected void Global()
    {
        BeginRequest += delegate
        {
            CurrentSession = SessionFactory.OpenSession();
        };
        EndRequest += delegate
        {
            if(CurrentSession != null)
                CurrentSession.Dispose();
        };
    }
}

私のプロジェクトでは、IoCコンテナー(StructureMap)を使用することにしました。
興味のある方はこちらをご覧ください。

于 2012-05-22T08:11:58.460 に答える
2

ありがとう@LeftyX

TekPubビデオマスタリングNHibernateをいくつかのカスタマイズで使用して、この問題を解決しました。

Global.asax

//Whenever the request from page comes in (single request for a page)
//open session and on request end close the session.

public static ISessionFactory SessionFactory =
   MyDomain.SessionProvider.CreateSessionFactory();

public MvcApplication() 
{
    this.BeginRequest += new EventHandler(MvcApplication_BeginRequest);
    this.EndRequest +=new EventHandler(MvcApplication_EndRequest);
}

private void MvcApplication_EndRequest(object sender, EventArgs e)
{
    CurrentSessionContext.Unbind(SessionFactory).Dispose();
}

private void MvcApplication_BeginRequest(object sender, EventArgs e)
{
    CurrentSessionContext.Bind(SessionFactory.OpenSession());
}

protected void Application_Start()
{
    SessionFactory.OpenSession();
}

と私のコントローラーの内部

 var session = MvcApplication.SessionFactory.GetCurrentSession();
 {
     using (ITransaction tx = session.BeginTransaction())
      {... omitting retrieving data}
 }
于 2012-05-22T09:30:10.963 に答える