zoukankan      html  css  js  c++  java
  • 第十回 基础才是重中之重~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页面时,事件后订阅,然后自动跳转到指定的页面。

  • 相关阅读:
    MySQL 优化实施方案
    MySQL Replication 主从复制全方位解决方案
    CentOS 7.X 系统安装及优化
    W25Q32的使用
    Word分栏
    转载:STM32之中断与事件---中断与事件的区别
    常见贴片电阻的分类、功率、封装、标注规则
    导线时延
    重装系统流程
    MFC应用程序向导生成的文件
  • 原文地址:https://www.cnblogs.com/ywsoftware/p/3068460.html
Copyright © 2011-2022 走看看