2011-09-02 65 views
2

我目前使用NHibernate與Spring.Net和使用Spring的開放式會話視圖模塊。據我所知,這個模塊只在BeginRequest上打開會話並在EndRequest上關閉它。它並不實際提交或刷新EndRequest上的會話。NHibernate的/ Spring.Net/Asp.Net的WebForms - 開放式交易依據請求

我知道,你可以使用Spring的[交易]屬性來裝點個性化的服務方式將執行在方法結束時提交,但我不希望使用此技術。

有什麼辦法來設置Spring的OSIV模塊,使其將刷新上EndRequest會議?如果沒有,是否有一種簡單的方法來實現我自己的開放會話視圖,這將實現這一目標?

我試圖從NH 3食譜實施例中「每個web請求會話」,但它在CurrentSessionContext拋出一個錯誤:

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     var sessionFactory = (ISessionFactory) ContextRegistry.GetContext().GetObject("MySessionFactory"); 
     var session = sessionFactory.OpenSession(); 
     CurrentSessionContext.Bind(session); 
    } 

    protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     var sessionFactory = (ISessionFactory)ContextRegistry.GetContext().GetObject("MySessionFactory"); 
     var session = CurrentSessionContext.Unbind(sessionFactory); 
     session.Dispose(); 
    } 

注:以上代碼只嘗試複製什麼春天。網目前正在做。我正計劃更新這個來刷新會話後,我得到它的工作。

我假設上面的代碼不工作,因爲我使用Spring.Net設置NH和的SessionFactory這可能使書中無效的例子。

任何幫助/建議將不勝感激。

我使用NHibernate 3.2和Spring 1.3.2

編輯:

閱讀http://forum.springsource.org/archive/index.php/t-16949.html後,我開始懷疑,如果每個請求的事務是一個好主意。

+1

爲什麼有沖水模式設置爲FlushMode.NEVER一些強有力的理由:http://forum.springframework.net/您可以在您的web.config設置一個appSettings鍵/值對設置刷新模式showthread.php?3304-OpenSessionInViewModule _Hover上的FlushMode.NEVER是有意設計的。這是因爲如果OSIV在「EndRequest」期間刷新等待更改併發生錯誤,則所有響應都已發送到客戶端。沒有辦法告訴客戶有關錯誤。因此,可以更改默認的FlushMode,但我不會推薦它._ – Andreas

+0

@Andreas我現在已經從我原來的想法中退出了。我原來的想法背後的主要原因是因爲我們有一個現有的網絡應用程序,在代碼後面有很多業務邏輯。我認爲將OSIV更新爲提交EndRequest會更簡單,而不必將代碼重構爲帶有Transaction屬性的服務方法。但是看起來我不得不忍受這一點。如果你想對這個建議提出反對意見,那麼我會很樂意接受它。謝謝。 – Rezler

回答

2

爲什麼有沖水模式設置爲FlushMode.NEVER一些強有力的理由:http://forum.springframework.net/showthread.php?3303-OpenSessionInViewModule

埃裏希Eichinger(SpringSource的有限公司)

上OSIV有FlushMode.NEVER是由設計。這是因爲如果OSIV 在「EndRequest」期間刷新等待更改並且發生錯誤,則所有 響應都已發送到客戶端。 將無法​​告訴客戶有關錯誤。因此可以更改默認的FlushMode,但我不會推薦它。

這就是說,有一個未公開的特性。

<configuration> 
    <appSettings> 
    ... 
    <add 
     key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.DefaultFlushMode" 
     value="Auto" 
     /> 
    </appSettings> 
    ... 
</configuration> 
-1

我不熟悉Spring.NET,但:會話工廠應該只是一個爲整個應用程序。詳情here。 會話在每個請求開始時打開。

我不知道這是否改變了NH3,但在我們的NH 2的應用程序,我們建立會話工廠是這樣的:

NHibernateConfiguration.BuildSessionFactory() 
+1

這真的沒有解決我問的問題。 Spring.Net在Application Start開始構建SessionFactory。 – Rezler