基础才是重中之重~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页面时,事件后订阅,然后自动跳转到指定的页面。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:基础才是重中之重~B/S系统中的事件订阅,如需转载请自行联系原博主。

目录
相关文章
|
3月前
|
边缘计算 JSON 物联网
解锁业务灵活性:RuleGo规则引擎的高效解耦与实时响应秘籍
RuleGo是一个基于Go语言的轻量级、高性能规则引擎,旨在通过动态规则链和组件化设计,简化复杂系统的业务逻辑管理和实时响应。
解锁业务灵活性:RuleGo规则引擎的高效解耦与实时响应秘籍
|
8月前
|
消息中间件 Dubbo IDE
业务中台如何实现业务结果的回调通知
这个问题暂且不表。我们先来看跨企业通信的业务回调通知。
110 0
|
7月前
|
运维
生产发布事件
生产发布事件
17 0
|
8月前
|
消息中间件 存储 负载均衡
对于钉钉OA事件订阅出现的网络波动导致的通知丢失问题
对于钉钉OA事件订阅出现的网络波动导致的通知丢失问题
86 1
|
8月前
|
存储 设计模式 监控
流程级事件风暴
流程级事件风暴
|
8月前
|
消息中间件 存储 中间件
消息组件选型分析
消息组件选型分析
|
11月前
|
消息中间件 XML 缓存
从使用者角度来看消息队列产品
众所周知,当下云计算的快速发展,伴随着日益流行以及普及的分布式架构,让消息队列领域也得到了联动发展。消息队列作为一种重要的异步通信机制,被越来越多的企业和开发者所采用。消息队列不仅可以解耦系统中的各个服务,提高系统的可扩展性和性能,还可以实现异步通信、数据缓存、数据同步等多种应用。当前,市面上常见的消息队列产品包括 Kafka、RabbitMQ、RocketMQ 等。从使用者的角度来看,这些消息队列产品在哪些方面值得注意,哪些方面需要改进,接下来将进行对应的探讨。
72 0
从使用者角度来看消息队列产品
|
消息中间件 弹性计算 运维
重新定义分析 - EventBridge实时事件分析平台发布
为了解决事件领域中针对流式事件做分析的难题,EventBridge 近日发布了针对事件/消息领域的全新分析工具--EventBridge 实时事件分析平台。下面简要对 EventBridge 实时事件分析平台的内容进行介绍。
179 0
重新定义分析 - EventBridge实时事件分析平台发布
|
传感器 存储 监控
谈谈基于事件流处理的物联网数据的应用模式
通过物联网(IoT)连接的设备出现在很多场合——汽车、工厂、家庭、零售店和可穿戴设备等等。
谈谈基于事件流处理的物联网数据的应用模式
【鸿蒙】订阅分布式数据变化
客户端需要实现KvStoreObserver接口。 构造并注册KvStoreObserver实例。
【鸿蒙】订阅分布式数据变化