2013-03-12 63 views
2

我正在構建一個ASP.Net MVC 4應用程序。用戶必須登錄並根據數據庫檢查帳戶。在這個數據庫中,用戶被關聯到一個或多個部門。用戶擁有的需求狀態一次只能爲一個部門使用該應用程序。如何保留會話數據,可用於業務層

這意味着成功登錄後,我會檢查用戶鏈接的部門數量。如果這只是一個,它將是活躍的部門。如果它不止一個,我會要求用戶選擇其中一個,這個選擇將是活躍的部門。該值必須在整個會話中保持不變。

應用程序中有很多用例只能訪問屬於活動部門的數據。這些限制適用於業務層,即不知道ASP.Net上下文的C#類庫。

我該如何最好地堅持用戶對活動部門的選擇?我不喜歡把它存儲在數據庫中的想法,因爲它不會在會話之後持續存在。另一方面,在我的業務層中,我找不到任何開箱即用的持久性配置。我的ASP.net應用程序提供了一個會話,但這些對於業務層來說是不可見的。

我是否應該將此值存儲在會話中並使用AuthenticateRequest事件或類似的東西將活動部門傳遞給業務層?

有沒有更好的選擇?

+0

這些對於業務層是不可見的?你什麼意思? – codingbiz 2013-03-12 16:33:40

回答

2

存放活躍部門可以在會話變量來實現:

Session["ActiveDepartment"] = 1

你不需要會話管理你的業務邏輯。在業務邏輯程序集中編寫一個包裝器,要求爲所有調用提供ActiveDepartmentID才能生效。包裝器總是返回由ActiveDepartmentID過濾的數據。

由於這是一個MVC應用程序,因此您可以通過在所有控制器操作中要求ActiveDepartmentID來在Controller級執行此操作。

+1

我選擇這個作爲答案,因爲它提供了一個更好的選擇。我不喜歡我的BL項目中對System.Web的引用。 – 2013-03-12 22:22:21

3

這些對於業務層是不可見的?你什麼意思?

您實際上可以從類庫訪問您的會話。你所要做的就是參考System.Web則:

1)導入命名空間在代碼

2)var sessionValue = HttpContext.Current.Session["ActiveDepartment"];

或者,您也可以在每次你需要它,而不是時間通過ActiveDepartment到業務層從會話中獲取它,因此您不會綁定到Web應用程序

+0

我的意思是不可見的BL類庫沒有對Web應用程序項目的引用。但是,我現在看到它不是必需的。 – 2013-03-12 22:09:40

+0

事實上,這令我感到驚訝,它可以工作。我通過將值存儲在Controller的Session屬性中並在業務層中的HttpContext.Current.Session的後續請求中檢索該值。我認爲這隻會在BL程序集加載到Web應用程序上下文中時才起作用。 – 2013-03-12 22:20:02