随笔 - 21, 文章 - 0, 评论 - 25, 阅读 - 53712
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Pipeline模式

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

     

     

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示