Asp.net web表单和通用处理程序(ashx文件)是否可以共享一个共同的祖先类(或基页)?
如果有一个ASP.net网站,它的web表单都继承自一个公共的基页,该基页检查身份验证和会话过期时重定向等内容,那么有没有办法在ashx处理程序中使用这个基类?我开始在处理程序中继承基页类,并意识到这可能不是推荐的做法。有没有关于如何避免代码重复的想法 这个可以吗Asp.net web表单和通用处理程序(ashx文件)是否可以共享一个共同的祖先类(或基页)?,asp.net,inheritance,handler,ashx,Asp.net,Inheritance,Handler,Ashx,如果有一个ASP.net网站,它的web表单都继承自一个公共的基页,该基页检查身份验证和会话过期时重定向等内容,那么有没有办法在ashx处理程序中使用这个基类?我开始在处理程序中继承基页类,并意识到这可能不是推荐的做法。有没有关于如何避免代码重复的想法 这个可以吗 public class FooHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { 变成这样 public class
public class FooHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
变成这样
public class FooHandler : BasePageClass, IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
我得到以下警告,这正是我重新考虑我所做的事情的原因:
ProcessRequest(System.Web.HttpContext)
隐藏继承的成员
System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)。
要覆盖该实现,请添加
覆盖关键字。否则添加
新关键字
您现在发现了为什么OO大师类型总是选择组合而不是继承。无论如何,完全按照您想要的方式进行操作是相当棘手的,因为尽管System.Web.UI.Page实现了IHttpHandler(如果我没记错的话),但要返回到您自己的处理程序,有很多内部处理是无法克服的
最简单的修复方法是尝试将尽可能多的函数从monster base page类移到它们自己的类中——或者更好的方法是将IHTTP模块移到它们自己的类中,在这些类中处理诸如会话过期之类的内容是有意义的——以便将事情解耦。您现在发现了为什么OO专家类型总是投票支持组合而不是继承。无论如何,完全按照您想要的方式进行操作是相当棘手的,因为尽管System.Web.UI.Page实现了IHttpHandler(如果我没记错的话),但要返回到您自己的处理程序,有很多内部处理是无法克服的
最简单的修复方法是尝试将尽可能多的函数从monster base page类移到它们自己的类中——或者更好的方法是将IHTTP模块移到它们自己的类中,在这些类中处理诸如会话过期之类的内容是有意义的——以便将事情解耦。如果将父类ProcessRequest设置为虚拟,则可以在子类中重写它,然后从重写的方法内部调用基类方法
public abstract class ParentHandler : IHttpHandler, IRequiresSessionState
{
protected WebConnectHandler Context;
public virtual void ProcessRequest(HttpContext context)
{
Context = new WebConnectHandler(context);
}
//...
}
//...
public class ChildHandler : ParentHandler
{
public override void ProcessRequest(HttpContext context)
{
base.ProcessRequest(context);
//the rest of your code
}
}
//...
如果将父类ProcessRequest设置为虚拟,则可以在子类中重写它,并从重写的方法内部调用基类方法
public abstract class ParentHandler : IHttpHandler, IRequiresSessionState
{
protected WebConnectHandler Context;
public virtual void ProcessRequest(HttpContext context)
{
Context = new WebConnectHandler(context);
}
//...
}
//...
public class ChildHandler : ParentHandler
{
public override void ProcessRequest(HttpContext context)
{
base.ProcessRequest(context);
//the rest of your code
}
}
//...