2012-05-10 35 views
3

我們有我們的第一個NHibernate項目進行得非常好。但是,我仍然沒有掌握如何在我們的場景中管理會話和對象的完整畫面。實體對象和NHibernate會話

所以,我們在一個持久對象模型中配置一個系統結構,存儲在一個數據庫中,使用NHibernate。

該系統由應用程序在服務進程中監視的物理設備組成。因此,在服務啓動時,我們實例化服務中的Device對象,並根據從設備接口讀取的數據更新其狀態。對象模型在服務的生命週期中保持活動狀態。

該服務還提供Silverlight客戶端,該客戶端顯示對象數據並可能操縱某些對象。但是它們必須訪問服務用於監視的相同對象,例如,因爲對象也具有內存數據,這些數據也不會被保留。 (是的,我們使用DTO對象實際上將數據傳輸到客戶端。)

由於該服務是一個多線程系統,所以問題是如何管理NHibernate會話。

我現在正在考慮一種方法,我們只需要一個後臺線程來處理後臺中的對象持久化,其他線程將「SaveRequests」放到我們的Repository中,而不是直接訪問NHibernate會話。通過這種方式,我可以爲服務使用單個會話並管理與訪問對象的服務和客戶端完全分離的NHibernate層。

我還沒有找到這樣的設置的任何文檔,因爲每個人都建議每會話請求模型或一些變化。但是,如果我正確地做到了,如果我在一個會話中實例化一個對象並將它保存在另一個會話中,它不是同一個對象 - 並且NHibernate似乎也會在數據庫中創建一個新條目。

我也試圖找出IOC容器在這種情況下的角色,但我還沒有找到任何有用的例子來證明他們真的可以幫助我。

我在正確的軌道上,還是應該如何繼續?

回答

2

考慮ISession是一個工作單元。您將需要在應用程序的上下文中定義構成工作單元的內容。工作單元是圍繞一系列較小操作的邊界,這些操作構成了一個完整的功能性任務(在您的應用程序的設計中,完成和功能由您定義)。您的服務是否響應Silverlight客戶端請求或其他外部請求?服務是否醒來在計時器上做一些工作?上述所有的?

您希望爲該工作單元創建會話,並在完成時進行處理。不建議您使用長時間運行的ISession實例,其中操作懶惰地使用他們可以找到的任何環境ISession。

的想法通常被描述爲這樣:

  1. 我需要做一些工作(因爲我響應事件,無論是傳入的請求,在計時器的工作,這不是」問題)。
  2. 因此,我需要開始一個新的工作單元(這可以幫助我跟蹤在執行這項工作時需要做的所有操作)。
  3. 工作單元開始一個新的ISession來跟蹤我的工作。
  4. 我做我的工作。
  5. 如果我能成功完成工作,我所有的更改都應該刷新並提交
    1. 如果沒有,請將所有更改回滾。
  6. 自己清理(處置ISession等)。
+0

是的,我已經考慮過了。但是因爲我的對象「永遠」活着,我認爲UnitOfWork也應該永遠活着。或者,我如何將一個會話中的更改始終與服務會話中活動的對象關聯起來?主界面不是客戶端,而是跟蹤系統狀態的服務應用程序,同時我們在對象中也有實時數據(例如狀態和當前值)。 –

+0

我想不出任何情況下,你會想'活着的對象'的時間超過〜1秒... – Phill

+0

我們決定監視是基於追蹤系統當前狀態的對象,因爲是主要部分。它們的配置一直存在,但不是現在的狀態。 –