2010-07-16 106 views
2

我看到有2分可能的情況作爲對會話處理:每次請求如何處理ASP.NET WebForms應用程序中的NHibernate會話?

  1. 打開一個單一的Isession。在請求開始時打開它並在請求結束時關閉它。
  2. 按概念「工作單元」打開一個ISession。爲請求創建了許多會話。

方法#1是我現在正在做的。我有點擔心,因爲雖然它有效,但調試有點困難。例如,我有一個對象沒有被保存(即使我命令它),而且我在調試時遇到了麻煩,因爲在完整的請求生命週期中發生了很多事情。

方法#2似乎是標準的最佳實踐(不確定關於ASP.NET),我相信調試起來更容易。我看到的問題是關於會話間通信。例如:My Page類持有對用戶的引用,這是一個持久對象。許多操作接收用戶作爲參數。由於用戶屬於不同的會話,因此我無法將其作爲參數傳遞。

我偏向於#2,但我不知道這是否是最佳做法,也不知道如何處理跨會話對象。

謝謝。

+0

爲什麼很難調試? – Paco 2010-07-16 11:58:19

回答

1

大多數人會爲了簡單起見而進行Session-Per-Request。

但是,您可以爲每個「工作單元」打開並提交事務。因此,每個會話都會有很多交易。 (通常的做法是確保事務提交時,會話同時被刷新)。

例如,點擊保存按鈕後,打開並提交一個事務。

會議將負責跟蹤您的所有實體。必要時,事務將負責清理數據庫。

使用此設置,應該更容易調試您的問題。

0

您可能會發現NHibernate Burrow對此有幫助,或至少對此感興趣,因爲它旨在幫助ASP .NET應用程序中的會話管理,實現跨多個請求的「長時間運行對話」的概念。

1

對於我正在處理的ASP.NET項目,我使用了這些方法的組合。

我在請求開始時打開一個ISession,並在請求結束時關閉它,就像您使用第一種方法一樣,並使用會話加載任何需要保持連接到會話的實體請求的持續時間。然而,當我需要保存,更新或刪除一個實體時,我創建一個新的瞬態對象,並將它交給一個新的ISession,與綁定請求的ISession分開。對於額外的工作單元,我創建了額外的會話。

0

我認爲你真正的問題是爲什麼不能讓我的對象保存。

即使想你使用的是單一的ISession你仍然需要可以刷新會話或部分保存/更新提交事務/刪除被COMMITED行動。

相關問題