2009-04-23 52 views
1

我正在維護一個ASP.NET網站,我注意到業務層和其他支持庫大量使用HttpContext.Current.Session。這使得很難跟蹤會話變量,確定它們用於什麼以及它們甚至存在的原因。網站的業務層應該訪問會話狀態嗎?

在業務層中使用會話被認爲是不好的做法嗎?開始將所有使用會話的代碼移動到代碼隱藏中是否明智?

回答

5

這幾乎從來都不是一個好主意。有很多原因,但這裏的一對夫婦:

  • 你永遠不可能比ASP.NET
  • 其他任何使用業務層代碼
  • 單元測試變得更加痛苦的,甚至是不可能的。

當我們開始構建利用公共業務層代碼的服務時,我們遇到了與此完全相同的情況,令人頭痛的問題。

1

是的 - BL不應該有關於會話的任何知識。它是您不需要的依賴項。

1

創建一個間接的類,在這種情況下,它可以在Web上返回HttpContext.Current.Session的值,並在其他地方從其他地方解析該類。 IE有一個接口ISessionStore,並具有具體的類WebSessionStore和WindowsFormsSessionStore等

這將使你的代碼更容易測試,並且當你說,你現在想要x業務邏輯運行在一個Windows服務可以每y分鐘運行一段代碼。

3

我遵循這個規則 - System.Web名稱空間(Java中的javax.servlet包)中的任何類都不應出現在您的業務層中。

1

在我看來這是不好的做法。

這使得將業務層從環境中分離出來非常困難。例如,如果你期望單元測試這件事,那麼你的運氣不好。爲了照顧這

一種方式簡單地將這個隔離成一個抽象現在,這樣就可以通過一個「狀態緩存」圍而不參考HttpContext的。這至少會在某種程度上抽象。 另一個更有趣的問題是,爲什麼業務層需要引用?

+0

這是關於單元測試的一個好處。至於爲何業務層需要的HttpContext:關於登錄用戶的信息,如他們的角色和權限,保存在會話,這可能會影響業務邏輯做什麼。我會試着將狀態抽象出來並傳遞出去 - 這聽起來像是一個很好的解決方案。 – tspauld 2009-04-23 20:27:59

1

它總是最好有一個集中的緩存/會話管理器,它封裝了與會話/緩存或您使用的任何持久方法的完整交互。讓你的BL與會話進行交互肯定是一種非常糟糕的做法,並以某種方式完全破壞了分層架構的目的。