博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Pipeline模式

Posted on 2011-06-17 23:52  肖敏  阅读(7541)  评论(2编辑  收藏  举报

      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。

       

        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            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像是流水线,每个对象负责一个动作,一起协作完成一个产品。