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