0

如果一个人有一个 ASP.net 网站,其 Web 表单都继承自一个公共基页——它会检查身份验证和在会话过期时重定向等内容——有没有办法在 ashx 处理程序中使用这个基类? 我通过继承处理程序中的基页类开始走这条路,并意识到这可能不是推荐的做法。关于如何避免代码重复的任何想法?

这个可以吗

public class FooHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {

变成这个

public class FooHandler : BasePageClass, IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {

我收到以下警告,这让我重新考虑我在做什么:

FooHandler.ProcessRequest(System.Web.HttpContext) 隐藏继承的成员 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)。要覆盖该实现,请添加 override 关键字。否则添加新关键字。

4

2 回答 2

4

如果将父类 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
    }
}
//...
于 2014-01-30T08:06:52.690 回答
1

您现在会发现为什么 OO 大师类型总是投票支持组合而不是继承。无论如何,做你想做的事情是相当棘手的,因为 System.Web.UI.Page 实现了 IHttpHandler (如果我没记错的话)有很多内部处理是你无法克服的,才能回到你自己的处理程序。

最简单的解决方法是尝试将尽可能多的这些功能从怪物基页类移到它们自己的类中——或者更好的 IHttpModules 处理诸如会话过期之类的东西是有意义的——以便解耦。

于 2010-10-06T17:57:04.947 回答