zoukankan      html  css  js  c++  java
  • 转 Pipeline模式

    Pipeline模式

    Posted on 2011-06-17 23:52 肖敏 阅读(930) 评论(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像是流水线,每个对象负责一个动作,一起协作完成一个产品。

         

         

    分类: C#基础篇
  • 相关阅读:
    javascript封装自定义滚动条方法,可自定义四个边框滚动条
    前端页面优化:javascript图片延迟加载
    VPS用LNMP安装WordPress
    结缘PDO
    Laravel踩坑笔记——illuminate/html被抛弃
    Android定时器实现方法[转]
    关于安装Android Studio的一些问题的解决方法
    nginx 多站点配置方法
    PHP5.6.x的新鲜事
    ThinkPHP学习手记——环境搭建
  • 原文地址:https://www.cnblogs.com/baiyu/p/2154785.html
Copyright © 2011-2022 走看看