zoukankan      html  css  js  c++  java
  • Community Server专题五:IHttpHandlerFactory

    如果你了解Factory设计模式,这篇文章可以不用看,只要会配置IHttpHandlerFactory就可以,不了解也没有关系,通过下面的文章你可以学会如何使用IHttpHandlerFactory,同时还会明白Factory设计模式的广义定义

    在前一篇专题中讲解了HttpHandlerCS中的运用以及一些相关的话题。其实实现HttpHandler功能还有另外一个选择就是Handler Factory(CS 中没有用到Handler Factory),这是通过继承IHttpHandlerFactory接口来实现的。

    IHttpHandlerFactory接口的定义如下:

    interface IHttpHandlerFactory

    {

    IHttpHandler GetHandler(HttpContext ctx, 
    string requestType, string url,string pathTranslated);

    void ReleaseHandler(IHttpHandler handler);

    }

    该接口中定义了2个方法,GetHandler方法在请求开始的时候被调用,而ReleaseHandler在请求结束,所有的Handler都不再需要的时候被调用。

    如何使用呢?大致有三个步骤:

    1:定义实际处理HttpHandler的类(实现IHttpHandler接口),这个类会在HandlerFactory中被调用以进行业务处理,一个HandlerFactory可以调用NHttpHandler类(不然就不叫Factory不是!)进行处理相关的业务逻辑。

    2:定义HandlerFactory,例:

    public class MyHandlerFactory : IHttpHandlerFactory

    {

    public IHttpHandler GetHandler(HttpContext ctx,string requestType,string url,string pathTranslated)

    {

    \\处理逻辑,最后返回一个HttpHandler类

    }


    public void ReleaseHandler(IHttpHandler handler) {}

    }

    前一步说过,一个HandlerFactory可以处理NHttpHandler,什么时候该处理什么HttpHandler就在这里的处理逻辑中实现,例如:以上一篇专题防盗链中说到的,你可以定义两个IHttpHandler实现,分别处理对图片与压缩文件的请求。由于GetHandler方法中传入了HttpContext的上下文,因此可以对上下文中的Url请求进行判断,然后启用不同的HttpHandler类。

    3:在Web.Config文件中注册这个HandlerFactory,注册的方式与HttpHandler是一样的。例:

    <httpHandlers>

    <add verb="*" path="*.*"

    type
    ="MyNamespace. MyHandlerFactory, MyAssembly" />

    </httpHandlers>

    注意,这里不要再对HttpHandler进行配置了,无论你定义了多少IHttpHandler实例,只要他们是通过HttpHandlerFactory调用实现其功能,在这里都不要去注册它,不然就重复了。

    IHttpHandlerFactory其实非常简单,存在的思想就是Factory设计模式(Factory模式:利用给Factory对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象,这里指返回具有同一IHttpHandler接口的对象)

    什么时候你要使用IHttpHandlerFactory而不去使用IHttpHandler,我就个人的开发经验做一下总结:

    1:在一个项目中需要使用很多IHttpHandler的时候,而且对这些IHttpHandler判断都重复做一个同样的前期处理,如果防盗链的例子中对图片和压缩两个不同HttpHandler的处理,但是他们对URL的判断都是一致的,在.Text中使用了IHttpHandlerFactory,而不是IHttpHandler,对于URL的请求全都(*.asmxError.aspx除外)转交由一个IHttpHandlerFactory入口统一处理。

    2:从部署和松散耦合考虑,如果你的web application足够大(我目前还没有设计过这种大型app),你就要考虑在更换HttpHandler处理类的时候该不该去改动Web.config的配置,这种改动将会重新启动整个app,对于一些系统而言这是不可以随便进行的。这个时候,统一一个入口的IHttpHandlerFactory很重要,这个入口相对不变,而IHttpHandler实现可以通过外挂自定义的xml文件来实现松散耦合,运用一些反射什么的就可以实现了。

  • 相关阅读:
    [zz]redhat6.0无法识别ntfs分区的解决方法
    使用ftp搭建yum源问题解决
    [zz]搭建centos6.0本地yum源(32位)
    JAVA传统线程技术
    JAVA判断字符串是否为数字
    java之异常
    随便记两笔Java中的反射
    【转】单例模式完全解析
    java.lang.Enum
    文件搜索
  • 原文地址:https://www.cnblogs.com/wzyexf/p/364447.html
Copyright © 2011-2022 走看看