0

我正在设计一个后台网站,使管理员能够管理内容、产品、价格等。我想在每个页面控制器(即代码隐藏类)将扩展的基类中解决两个问题,它们是:

  1. 将 ViewState 存储在磁盘上,以及
  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);
}
4

1 回答 1

1

我不得不说,在没有特别的解决方案的情况下,良好的关注点分离实际上在上述嵌套层次结构中被打乱了。似乎功能部分应该进一步分开,以便在每次需要另一个时都不要包括在内。

为什么必须在同一个空间中拥有视图状态和验证?为什么不完全分开呢?

于 2009-02-09T15:12:24.170 回答