如果你了解factory设计模式,这篇文章可以不用看,只要会配置ihttphandlerfactory就可以,不了解也没有关系,通过下面的文章你可以学会如何使用ihttphandlerfactory,同时还会明白factory设计模式的广义定义
在前一篇专题中讲解了httphandler在cs中的运用以及一些相关的话题。其实实现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可以调用n个httphandler类(不然就不叫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可以处理n个httphandler,什么时候该处理什么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的请求全都(*.asmx、error.aspx除外)转交由一个ihttphandlerfactory入口统一处理。
2:从部署和松散耦合考虑,如果你的web application足够大(我目前还没有设计过这种大型app),你就要考虑在更换httphandler处理类的时候该不该去改动web.config的配置,这种改动将会重新启动整个app,对于一些系统而言这是不可以随便进行的。这个时候,统一一个入口的ihttphandlerfactory很重要,这个入口相对不变,而ihttphandler实现可以通过外挂自定义的xml文件来实现松散耦合,运用一些反射什么的就可以实现了。
如果对ihttphandlerfactory有其他见解的朋友请留下你的观点。
新闻热点
疑难解答