65.9K
CodeProject 正在变化。 阅读更多。
Home

Web 应用程序的简单模板设计

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.18/5 (5投票s)

2005年11月3日

CPOL

4分钟阅读

viewsIcon

51378

downloadIcon

479

使用 OOP 设计可伸缩、可维护的 Web 应用程序的指南。

引言

本文介绍了一种使用 ASP.NET 和 OOP 设计可伸缩、可维护且可扩展的 Web 应用程序的非常基本的方法。

定义应用程序的基类

Web 应用程序在访问页面时具有一些有效的用户身份验证是很常见的。可以在应用程序的 web.config 文件中设置授权和身份验证。更直观地说,我们可以将其视为拥有一个基础的安全 Web 页面类,该类可以处理验证和登录,而无需开发人员在开发的每个页面上处理验证代码。(此外,我们还可以有一个不安全页面基类,应用程序中的不安全页面可以从中派生)。要实现此方法,请声明一个类,如下所示:

public class SecuredWebPage: System.Web.UI.Page{

    public SecuredWebPage()
    {}
    public void OnInit( System.Web.UI.Page Page)
    {
        if (Page.Session["CustomSession"] == null)
        {
            Page.Response.Redirect ("LogOn.aspx?CallingPage=" + Request.RawUrl );
        }
    }
}

public class NonSecuredWebPage: System.Web.UI.Page
{
    public NonSecuredWebPage()
    {}
    public void OnInit(System.Web.UI.Page Page)
    {
        if (Page.Session["GenericSession"] == null)
        {
            GenericSession genericSession = new GenericSession();
            genericSession.User = "Ananymous";
            Page.Session["GenericSession"] = genericSession;
        }
    }

上述两个类在 Init 事件中接受 Web UI 页面作为参数,并检查有效会话,然后根据需要进行重定向或设置值。有效会话的检查可以根据业务需求进行完全自定义。但是,为了拥有一个更强大、更有组织且更易于维护的会话,我们可以定义一个会话类,设置该类的相应属性,并将该类存储在会话中。

例如,我们可以将用户名/密码/ID/连接字符串等存储在会话中。

定义会话类

public class CustomSession
{
   private string mstrUser = "";
   private string mstrPassword = "";
   public CustomSession()
   {}
   public string User
   {
      get{ return mstrUser;}
      set {mstrUser = value;}
   }
   public string Password
   {
      get {return mstrPassword;}
      set {mstrPassword = value;}
   }
}

public class GenericSession
{
  private string mstrUser = "";
  public string User
  {
     get{ return mstrUser;}
     set {mstrUser = value;}
  }
}

在会话类中,有两个类:一个用于所有安全会话信息,另一个用于非安全页面上可能需要的通用会话信息。此会话类可以扩展以添加连接字符串信息/访问级别信息等。所有这些会话值将在用户登录应用程序时设置。

应用程序中的页面将继承自安全 Web 页面或不安全 Web 页面。

下面是安全 Web 页面的示例代码

定义应用程序中的 Web 页面

public class WebForm1 : Ez.SecuredWebpage{
   private void Page_Load(object sender, System.EventArgs e)
   {
      CustomSession customSession = (CustomSession) Session["CustomSession"];
      Response.Write ("The Page is logged on with User - ");
      Response.Write(customSession.User);
      Response.Write ("<BR>");
      Response.Write ("and the password is ");
      Response.Write (customSession.Password);
   }

   override protected void OnInit(EventArgs e)
   {
       base.OnInit(this);
   }
}

public class WebForm3 : Ez.NonSecuredWebPage
{
   private void Page_Load(object sender, System.EventArgs e)
   {
      GenericSession genericSession = 
        (GenericSession) Session["GenericSession"];
      Response.Write ("The Page is a non secured " + 
                      "page logged on with User - ");
      Response.Write(genericSession.User);
   }

   override protected void OnInit(EventArgs e)
   {     
      base.OnInit(this);  
   }
}

通过上述方法,如果 Web 页面继承自定义的两个基页类中的任何一个,它们将处理会话和登录。开发人员不必在应用程序的所有页面上编写检查有效凭据并将用户重定向到登录页面的代码。这种方法不仅处理应用程序的页面导航,还可以处理用户尝试通过输入 URL 访问应用程序中的页面时的逻辑。本示例中使用的登录页面是一个派生自默认 System.Web.UI.Page 的 ASPX 页面。它将处理登录验证并保存相应的会话。此示例中使用的代码仅设置自定义会话属性。

将设计范围扩展到多个应用程序

如果 Web 项目需要处理多个应用程序,则可以扩展上述方法,将应用程序放在单独的文件夹中,并将基类和会话放在公共文件夹中。各个项目可以拥有自己的中间基类,该中间基类从上述基类派生。当从不同应用程序调用基类时,我们可以设置该类的属性,并且根据设置的属性值,可以修改基类以设置应用程序访问所需的可唯一会话属性。例如,如果您从一个应用程序转到另一个需要不同访问级别或不同数据库连接的应用程序中的页面,则可以在此处处理。并且可以根据需要将用户重定向到相应的页面或登录页面。

此外,应用程序和页面的数量越多,越倾向于在设计中使用更模块化的方法。例如,将所有实用程序访问代码(如文件 I/O 或注册表访问)定义在项目的公共文件夹中,并在各个应用程序中引用它。这样,所有相似的代码都将集中在一个地方。对于数据访问,即使我们使用直接的 ADO,只需将代码封装在一个类中,并在应用程序中访问该类。这样,我们就有一个 OOP 的基础集,并且可以在类中自定义所有内容(例如,我们可以在类中实现填充数据集),并且调用代码只需调用该函数,而无需拥有填充 ADO 数据集的所有代码。

上述方法旨在定义一种实现 OOP 的可伸缩、可维护的 Web 应用程序。根据您的需求,可以对这种方法进行更多模块化,并用很少的精力开发复杂的 Web 应用程序。

结论

上述方法是定义一种实现 OOP 的可伸缩、可维护的 Web 应用程序开发模式的尝试。根据上述解释的需求,可以对此方法进行更多模块化,并且可以轻松开发复杂的 Web 应用程序。样本应用程序中使用的完整源代码附在链接中。此样本未实现任何复杂代码。它提供了在设计 Web 应用程序时可以考虑的方法。

© . All rights reserved.