2012-09-07 39 views
2

也許我已經以「理想」的方式來做這件事,但不知何故,它對我來說並不合適。會話/事務管理使用MVVM數據綁定的NHibernate

我有一個搜索表單,找到結果後立即顯示信息通過不同的控件(其中三個是綁定到eachother的datagrid)。

目前我已經把我的UOW管理起來如下:

  • 當永遠的用戶開始搜索檢查,如果我們有一個老UOW和處置它(和它的會話)
  • 創建一個新的UOW
  • 開始交易
  • 執行搜索
  • 提交交易

代碼示例:

if(_unitOfWork != null) 
{ 
    _unitOfWork.Dispose(); 
} 

_unitOfWork = new UnitOfWork(); 

_unitOfWork.Begin(); 
ICollection<Case> cases = casesQuery.ToList(); 
_unitOfWork.Commit(); 

理想我想所有物體在這一點上進行數據綁定,並綁定完成後,我想處置UOW的。

不幸的是,我不能這樣做,因爲數據綁定的三個數據網格中的兩個是懶惰加載beeing。在這些實體中顯式加載集合&對象圖並不是真正的選擇,因爲這些實體中的一些是具有不同屬性&引用的子類。顯式加載這些似乎很多工作。

我想知道的是,如果有一種方法可以讓這個更好,我已經考慮了以下幾點:

  • 使用轉換器來獲取值beeing數據綁定,findout如果它是一個代理如果是的話加載這個代理。這意味着我必須設置一個轉換器,以每數據綁定屬性,它似乎再次低效
  • 明確裝入,原因不這樣做在上面
  • 我目前的方案中提到,使UOW跨越的「搜索」,最大與此問題是,我不能保持一個事務打開,而東西是懶惰加載。 (我可以,但似乎像一個非常糟糕的事情要做由於用戶可以保留該交易開放indefinatly)

有沒有人有更好的方式來處理這種情況還是我在做什麼目前可能的最好的事情?

回答

0

在MVVM應用程序中,最常見的模式是爲每個VM創建一個會話。這使得延遲加載和富客戶端更改跟蹤成爲可能,而無需額外的工作。

目前的方法沒有錯。不能在事務內部進行延遲加載並不是什麼大事。

現在,如果您可以創建基於反射的解決方案,則顯式加載看起來不像「太多工作」。但你仍然需要知道要加載什麼。無論如何,這比轉換器的想法要少得多。

+0

是的,我沿着反射路線走了。我遇到的最大問題是,我必須考慮到一些屬性會參考我不喜歡的父實體(循環引用)。此外,它會導致整個圖形加載(達到特定的嵌套級別),這也有助於減少Lazy Loading的額外優勢。我現在擁有的確實是每個虛擬機的一個UoW,但它只是感覺不到......對我來說很整潔,也許我需要習慣它。 –