2009-02-09 50 views
0

我正在設計一個後臺辦公室網站,使管理員能夠管理內容,產品,價格等。我有兩個問題,我想在一個基類,每個頁面控制器(即代碼隱藏類)將延伸到解決,而這些都是:ViewState中的磁盤上在asp.net導致層次混亂的問題分離

  1. 存儲和
  2. 用戶驗證。

此外,我希望每個頁面控制器在設置事件處理程序,填充表單和保存數據時都遵循相同的設計。我想通過創建頁面控制器實現的抽象方法來解決這個問題。

現在,創建一個迎合ViewState存儲和用戶驗證的基類,並進一步定義瞭如何設置事件處理程序,何時設置事件處理程序,填充表單並將數據保留給我太多混亂。我喜歡高度分離的關注點,我傾向於創建三個基類​​:

System.Web.UI.Page
|
FileSystemStatePage:System.Web.UI.Page
(存儲ViewState)
|
SecurePage:FileSystemStatePage
(用戶驗證)
|
PageBase:SecurePage
(抽象,定義了用於設置事件處理程序,形式人口,節約方法)

現在我與關注點分離很高興,但我並不感到關於深的類層次結構。如果我發現自己需要用戶驗證而不是磁盤上的ViewState?所以...

...你們通常如何解決這些問題?

public class FileSystemStatePage : Page 
{ 
    protected override void SavePageStateToPersistenceMedium(object viewState) 
    { 
     // Serialize ViewState... 
     // Save to disk... 
    } 

    protected override object LoadPageStateFromPersistenceMedium() 
    { 
// Read file content... 
// Deserialize and return... 
    } 
} 

public class SecurePage : FileSystemStatePage 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     if (!ValidateUser()) Response.Redirect("~/Login.aspx"); 

     base.OnInit(e); 
    } 

    protected virtual bool ValidateUser() 
    { 
     return LoginHelper.LoggedInSystemUser != null; 
    } 
} 

public abstract class PageBase : SecurePage 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     SetEventHandlers(); 
    } 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     if (!IsPostBack) 
     { 
      Populate(); 
     } 
    } 
    protected abstract void SetEventHandlers(); 
    protected abstract void Populate(); 
    protected abstract void OnCancel(object sender, EventArgs e); 
    protected abstract void OnSave(object sender, EventArgs e); 
} 

回答

1

我不得不說,沒有特別的解決方案,在上面的嵌套層次結構中,問題的一個好的分離實際上被打亂了。看起來功能件應該進一步分開,以便在每次需要時不包括功能件。

爲什麼您需要在同一個空間中查看狀態和驗證?爲什麼不把它分開?

+0

當然,你是對的,儘管它至少增加了模塊性和代碼的重用。話雖如此,我會建議您進一步分離職能。謝謝回答。 – Marcus 2009-02-11 11:58:03