2009-07-11 52 views
1

比方說,我有一個簡單的視圖,顯示產品名稱以及是否已停產。我正在將數據從Northwind數據庫中提取出來。我在NHibernate中使用了一個簡單的模型視圖模式和一個DAO模式。當表單加載時,我的用戶界面有一個加載按鈕和一個保存按鈕。如果我點擊加載按鈕而不是在後面的代碼中,我只需將該調用傳遞給我的Presenter以加載數據。 Preseneter調用DAO來獲取數據並用數據填充視圖。比我點擊保存按鈕。我的代碼再次傳遞給主持人。演示者需要有在Load上創建的會話對象來做樂觀的併發,改變跟蹤等......Nhibernate和ISession

所以我的問題是我在哪裏創建我的ISession對象,以便它可以改變跟蹤和樂觀併發?

回答

0

HTTP是無狀態的。您的工作單元僅存在於服務器端。至於點擊'加載',那麼你的UOW只是簡單地檢索記錄並映射到你的視圖模型。 '保存'和工作單元在您打開服務器時開始 - 而不是在加載過程中,在瀏覽器中編輯,然後返回到服務器。

明智的實現你不應該在內存中保留ISession(在你的情況下,ASP.Net會話對象),它是一個用盡內存和非託管ado.net資源的快速方法。有些人選擇在begin_request中將ISession與HTTP Context關聯起來,並在end_request上進行處理,各種UOW示例當然可以更細化,但在所有情況下,它永遠不會比這更進一步存在。

在一個簡單系統中,點擊'保存'時,您需要使用ID(隱藏字段或不是什麼)將產品從數據庫中拉出來,從Request.Form中設置屬性,然後更新數據庫。

至於併發性。如果您錄製的時間戳或增量版本在一個隱藏字段

<input type="hidden" name="version" value="12"/> 

然後,當你點擊保存,你拉出來的產品數據庫,檢查中的Request.Form匹配的版本號,然後保存,如果不向用戶返回自上次檢索以來數據已更改,是否要繼續? NHibernate具有時間戳/版本字段,因此當您實際將數據庫命中「更新」中的where子句時會進行比較,因此在這種情況下,它甚至可以說明您提交時的變化。

有更復雜和更復雜的方法,但通常你不能/不應該在你的asp.net會話對象中粘住ISession。

+0

沒有考慮web應用程序。我想知道winform應用程序。對不起,我沒有在我的問題中指定 – codemnky 2009-07-12 05:11:00

相關問題