好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

B/S系统中的事件订阅

B/S系统中的事件订阅

我之前写一篇关于事件订阅的文章( 事件的好处~实现对修改的封闭,对扩展的开放!~续 ),但它主要是订阅静态事件,而今天主要讲的是实例事件,即,当一个事件发布者被实例化后,去订阅它里面的事件,然后当这个事件发布者去触发该事件时,自己执行你订阅的内容,这没什么可说的,一切都很正常。

但在B/s系统中,常常都有这样一种需求,即:Order类中有方法GeneratorOrder,即生成订单的方法,这个方法会被UI层的很多方法调用,以实现对不同业务产品的购买,如:购买家电产品,购买成功后应该去和家电有关的成功页;而购买日常用品,成功后应该去与日常用户相关的页面;以后还会有其它业务产品的成功页,需要我们去实现。

作法1:用static event,静态事件,但有一个问题,由于它是对类而言的事件,所以A用户订阅的事件,在B用户通过浏览器查看时,也会订阅这个事件,所以,静态事件不能满足我们的要求(一般用静态事件做全局性的工作)

作法2:直接把所有产品所对应的成功页写在Generatororder方法里,通过switch去分别处理;这种作法可以解决这个问题,但这样的程序没有任何的可扩展性而言,也不是真正面向对象的程序。

作法3:使用普通事件,在产品A订阅完成事件后,将事件发布者以参数的形式,传递给generatororder方法,这就一种最标准,更可靠的作法。

代码如下:

  1     ///   <summary> 
  2       ///   事件发布者
   3       ///   </summary> 
  4       public   partial   class   ReturnMsgClass
   5       {
   6           partial   void   OnLoad();
   7           public   ReturnMsgClass()
   8           {
   9               OnLoad();
  10           }
  11  
 12           #region  Events
 13           ///   <summary> 
 14           ///   返回消息事件[实例事件]
  15           ///   </summary> 
 16           public   event  Func< string >  ReturnMsg;
  17           #endregion 
 18  
 19           #region  OnEvents Methods
 20           ///   <summary> 
 21           ///   触发ReturnMsg事件
  22           ///   </summary> 
 23           public   string   OnReturnMsg()
  24           {
  25               if  (( this .ReturnMsg !=  null  ))
  26               {
  27                   return   this  .ReturnMsg();
  28               }
  29               else 
 30                   return   "  没有订阅事件  "  ;
  31           }
  32           #endregion 
 33      }

下面是事件的订阅者,它应该传入的事件发布者对象,去订阅相应的事件

  1   ///   <summary> 
  2       ///   事件订阅者
   3       ///   </summary> 
  4       public   class   Subscriber
   5       {
   6           public  Subscriber(ReturnMsgClass returnMsgClass,  string   url)
   7           {
   8              returnMsgClass.ReturnMsg +=  delegate () {  return   url; };
   9           }
  10      }

而对于A类产品在购买成功后,然后执行一些逻辑

 1    public   partial   class   HomeController
  2       {
  3           public   ActionResult Test()
  4           {
  5              ReturnMsgClass rm =  new   ReturnMsgClass();
  6              Subscriber sub =  new  Subscriber(rm,  "  http://www.sina.com  "  ); //如果订阅成功,就将这个地址返回
   7               return  View( "  Index  "  , rm);
  8           }
  9      }

而在购买成功页,将会有这样的重定向的逻辑

 1     @{
  2          Response.Redirect((Model  as  TEstMv3.Controllers.ReturnMsgClass ??  new   TEstMv3.Controllers.ReturnMsgClass()).OnReturnMsg());
  3      }

最后,实现的效果就是,当用户访问test页面时,事件后订阅,然后自动跳转到指定的页面。

 

返回目录   基础才是重中之重系列~目录(永久更新中)

 

分类:  C# ,  面向对象 ,  系统架构

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于B/S系统中的事件订阅的详细内容...

  阅读:46次