ASP.NET常用功能

时间:2011-04-04 13:08:56

标签: c# refactoring asp.net-2.0 multiple-inheritance

我有一个复杂的ASP.NET项目(ASP.NET 2.0),我正在尝试重构代码。

每个页面都扩展了一个名为GenericPage的基页,它具有一组在页面生命周期中使用的函数(访问session / HttpApplicationState对象的函数)。还有相当多的用户控件执行类似的操作,但扩展了一个单独的基类。

我们开始重新实现许多代码以使用WebServices,并且他们需要访问相同的功能。 WebServices将扩展GenericWebService。

如果一个扩展了Page而另一个扩展了WebService,那么两个都无法从同一个类扩展,那么构建这个的最佳方法是什么?我不想在3个单独的基类中复制代码,因为它越来越难以维护。

我可以将这些非静态功能放在一个共同的地方吗?

由于

1 个答案:

答案 0 :(得分:5)

您可以创建一个使用HttpContext.Current访问会话等的类。这个类不需要从任何东西下降,只需将它注入(或以其他方式实例化)到您的基页和基本Web服务中。

以下是该类可能的样子;我有一个用于轻松访问Session对象的辅助属性,以及一个存储当前用户ID的简单属性。您可能需要更多的错误处理,或者访问会话以外的其他内容,但是如何做更多的事情应该非常简单。

public class WebSessionHolder
{
    protected HttpSessionState Session
    {
        get {
           if (HttpContext.Current == null)
               throw new ApplicationException(); //Oops, not running in a web request.  Do something sensible here...
           return HttpContext.Current.Session;
        }
    }

    public int? CurrentUserID
    {
        get { return (int?)Session["CurrentUserID"]; }
        set { Session["CurrentUserID"] = value; }
    }
}

然后在你的基页:

public class BasePage : Page
{
    public WebSessionHolder WebSession { get; set; }

    public BasePage()
    {
        WebSession = new WebSessionHolder(); // Or inject if you are using it.
    }
}

最后一点是要么直接更改所有正在访问Session的当前BasePage属性,而是通过WebSession属性进行访问,要么更改所有引用代码以获取它(从BasePage中删除辅助属性)。 / p>