转 Pipeline模式
1.意图
使多个对象处理同一个请求,这些对象形成一条链。每个对象拥有下一个对象的引用,该对象可以进行预处理,交给下一个对象处理,然后把处理结果进行后处理,再返回给前一对象。最终返回给客户端,形成一个“回路”。
2.典型应用。
Http Pipeline。客户端发送一个URL请求IIS接受到以后,由一系列的对象就行处理最终返回Html Stream给客户端。
HttpApplication,Page都实现了IHttpHandler接口。并且,在这个对象链条中,下一个对象是由上一个对象动态创建的。比方页面请求和WebService会使用不同的HttpHandler处理。
另外,IHttpHandler其实只有一个方法,并且没有返回值。每个HttpHandler都会将处理结果放在HttpContext对象中,通过对HttpContext直接操作来做预处理与后处理。
Http Modules
HttpApplication有许多事件。Http Module 是通过对HttpApplication注册事件响应函数来实现对同一个HttpContext的处理的。
AOP的拦截器。当一个方法被调用时,先由一系列的拦截器进行预处理,然后才真正调用该方法,然后再把结果返回给拦截器进行后处理。
每个拦截器都实现了ICallHandler接口,该接口主要方法为
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
在该方法内调用代理getNext(input,getNext)返回后一个拦截器执行的结果。
在getNext代理执行前做预处理,执行后做后处理。例如LogCallHandler。
{
LogPreCall(input);//预处理
Stopwatch sw = new Stopwatch();
if (includeCallTime)
{
sw.Start();
}
IMethodReturn result = getNext().Invoke(input, getNext);
if (includeCallTime)
{
sw.Stop();
}
LogPostCall(input, sw, result);//后处理
return result;
}
与HttpPipline不同的是,这里使用对返回值IMethodReturn进行后处理,再返回IMethodReturn 给上一个处理对象。显然受HttpPipline的启发,我们也可以使用一个Context对象把处理结果都放在里面,这样也许可读性会更强一点。
3.结构。与职责链一样。
4.与职责链的区别
职责链的对象最终只有一个处理请求,而Pipeline是每个对象都会处理请求。职责链就像是局域网里的广播,只有一个网卡接受信息。而Pipeline像是流水线,每个对象负责一个动作,一起协作完成一个产品。