在C#中,我们可以在一个类中定义自己的事件,而其他的类可以订阅该事件,当某些事情发生时,可以通知到该类。这对于桌面应用或者独立的windows服务来说是非常有用的。但对于一个web应用来说是有点问题的,因为对象都是在web请求中创建的,而且这些对象生命周期都很短,因而注册某些类的事件是很困难的。此外,注册其他类的事件会使得类紧耦合。事件总线便可以用来解耦并重复利用应用中的逻辑。
好处比较明显,就是独立出一个<code>发布订阅模块</code>,调用者可以通过使用这个模块,屏蔽一些线程切换问题,简单地实现发布订阅功能。
坏处可能比较隐晦,但这些需要足够引起我们的重视
大量的滥用,将导致逻辑的分散,出现问题后很难定位。
没办法实现强类型,在编译的时候就发现问题。
代码可读性有些问题,IDE无法识别这些协议,对IDE不友好。
总得来说,如果项目里面有大量的事件交互,那么还是可以通过<code>EventBus</code>来实现,否则还是推荐自己在模块内部实现<code>观察者模式。</code>
所以今天介绍一个简单的事件总线,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。
程序目录结构如下:

事件总线是被所有触发并处理事件的其他类共享的单例对象。要使用事件总线,首先应该获得它的一个引用。下面有两种方法来处理:
触发事件之前,应该先要定义该事件。EventBus为我们提供了Subscribe 方法来订阅事件:
<a></a>
所以的事件都集成自IEvent,该类包含了类处理事件需要的属性。
对于事件源,则可以通过Publish 方法发布事件。触发一个事件很简单,如下所示:
下面是发布事件的调用:
要处理一个事件,应该要实现IEventHandler接口,如下所示:
在一个单一的处理句柄中,可以处理多个事件。这时,你应该为每个事件实现IEventHandler。比如:
以上,就把事件总线介绍完了,完整的代码,请到github 上下载,这个只是EventBus 的简单实现,各位可以根据自己的实际场景和需求,优化修改。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以微信:18618243664 联系我,非常感谢。
扫下面的二维码关注我的微信公众号。