2009-05-27 73 views
7

我有一個應用程序是在香草ASP.NET中編寫的,我想移植到ASP.NET MVC。ASP.NET MVC會話vs全局vs高速緩存

但是,我對持久對象的正確位置感到困惑。我需要持續幾個原因:

  1. 我想大家有一個數據庫連接,包裹在「資源庫」或「經理」樣式對象。
  2. 每個用戶都有一個用戶對象,需要按每個會話保存。

通常情況下,我會說#1會被保存爲Globals.asax中的一個靜態項目,可以使用Global.Repository或類似命令來命中。

我通常會說#2應該是一個會話後備存儲在頁面的基類中某處的屬性。

現在我很困惑的原因是我聽說MVC中的會話已經發生了變化,Global.asax不再擁有相同的類。此外,頁面的概念已被刪除,因此將屬性添加到控制器的基類似乎是錯誤的。

什麼說yall?

回答

10

你的數據庫將在你的控制器的基類中。這個基類應該擴展Controller,並且所有的控制器都應該擴展基類。這裏有一個小例子:

public class BaseController : Controller 
{ 
    private AuthServices _auth; 
    private LogHelper _log; 
    private Repository _repository; 

    /// <summary> 
    /// <see cref="AuthServices"/> 
    /// </summary> 
    protected AuthServices Authorization 
    { 
     get { return _auth ?? (_auth = new AuthServices()); } 
    } 

    /// <summary> 
    /// <see cref="LogHelper"/> 
    /// </summary> 
    protected LogHelper Log 
    { 
     get { return _log ?? (_log = new LogHelper()); } 
    } 

    /// <summary> 
    /// <see cref="Repository"/> 
    /// </summary> 
    protected Repository Repository 
    { 
     get { return _repository ?? (_repository = new Repository()); } 
    } 
} 

注意懶惰的實例化。這允許我在運行測試之前偷偷摸摸地設置我的私人領域。

至於會話,您的用戶對象仍然可以保存在會話中,就像在傳統的ASP.NET應用程序中一樣。幾乎所有東西都還在(響應,緩存,會話等)中,但其中一些已用System.Web.Abstractions中的類包裝,以便可以將它們模擬進行測試。儘管你不應該在傳統角色中使用其中的一部分(例如,不要使用Response.Redirect,而是返回執行重定向的RedirectToRouteResult之類的ActionResult),但它們仍然具有相同的行爲方式。

至於你的問題背後的原因....

做單數據庫連接不上的壓力。根據您的實施情況,這可能是一個糟糕的主意,因爲請求可能會彼此接連。只要打開你的connex,使用它,並完成後處理/關閉它。另外,MVC帶來的最大變化之一是拒絕了傳統的ASP.NET試圖爲Web開發帶來的有狀態模型。所有框架和視圖狀態都不存在了(不要理會幕後的那個人)。您對Web應用程序的複雜性和可靠性要求越低。試試吧,你可能會喜歡它。

+1

「請注意懶惰的實例化,這使我可以在運行測試之前偷偷摸摸地設置我的私有字段並進行模擬。」爲什麼不使用IoC? – 2009-05-27 15:46:46

+1

寶寶的步驟......你應該用一個這樣的例子來回答。 – Will 2009-05-27 16:50:19

2

會話在MVC中根本沒有改變。 Global.asax中的GlobalApplication類仍然存在。也存在頁面,你也想在控制器而不是頁面中引用一個存儲庫。將屬性添加到基本控制器類是沒有問題的;我一直這樣做。

4

如果你使用會話,我會建議有一個會話類,這樣你只需要在代碼中指定一次字符串名稱,這也會給你IntelliSence。

public static class SessionHandler 
{ 
    // User Values 
    private static string _userID = "UserID"; 
    private static string _userRole = "UserRole"; 

    public static string UserID 
    { 
     get 
     { 
      if (HttpContext.Current.Session[SessionHandler._userID] == null) 
      { return string.Empty; } 
      else 
      { return HttpContext.Current.Session[SessionHandler._userID].ToString(); } 
     } 
     set 
     { HttpContext.Current.Session[SessionHandler._userID] = value; } 

    } 

    public static string UserRole 
    { 
     get 
     { 
      if (HttpContext.Current.Session[SessionHandler._userRole] == null) 
      { return string.Empty; } 
      else 
      { return HttpContext.Current.Session[SessionHandler._userRole].ToString(); } 
     } 
     set 
     { HttpContext.Current.Session[SessionHandler._userRole] = value; } 

    } 
} 
1

您可以創建一個模型聯編程序來封裝狀態。

(見史蒂夫·桑德森對他的購物車實現MVC書)

隨着模型綁定,您可以訪問controllerContext - 擁有的HttpContext。