我有一个复杂的ASP.NET项目(ASP.NET 2.0),我正在尝试重构代码。
每个页面都扩展了一个名为GenericPage的基页,它具有一组在页面生命周期中使用的函数(访问session / HttpApplicationState对象的函数)。还有相当多的用户控件执行类似的操作,但扩展了一个单独的基类。
我们开始重新实现许多代码以使用WebServices,并且他们需要访问相同的功能。 WebServices将扩展GenericWebService。
如果一个扩展了Page而另一个扩展了WebService,那么两个都无法从同一个类扩展,那么构建这个的最佳方法是什么?我不想在3个单独的基类中复制代码,因为它越来越难以维护。
我可以将这些非静态功能放在一个共同的地方吗?
由于
答案 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>