我正在设计一个后台网站,使管理员能够管理内容、产品、价格等。我想在每个页面控制器(即代码隐藏类)将扩展的基类中解决两个问题,它们是:
- 将 ViewState 存储在磁盘上,以及
- 用户验证。
此外,我希望每个页面控制器在设置事件处理程序、填充表单和保存数据时都遵循相同的设计。我想通过创建页面控制器实现的抽象方法来解决这个问题。
现在,创建一个满足 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);
}