博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事件驱动下
阅读量:6192 次
发布时间:2019-06-21

本文共 1922 字,大约阅读时间需要 6 分钟。

前言

上一篇说到为什么要使用事件驱动,但是只有概念是不够的,我们要代码呀!记得脸书的老总说过: “Talk is cheap, Show me the code!”

实现思路

发出事件

事件顾名思义就是一件事情发生了,比如我要上头条,这不是一个事件,这事一个Command, HeadCommand, 而我上头条了这就是一个事件HeadedEvent,事件就是一件事情已经发生了。 好,先来一个伪代码

public void Head() { var NewsPaper = new NewsPaper("南都娱乐"); NewsPaper.WriteToHeader("汪峰"); RaiseEvent(new HeadedEvent {Name = "汪峰"}); }

所以我们只需在代码里RaiseEvent就可以了。

那么如何订阅事件

其实很简单,因为我们要实现的是同步的事件,我们只需要找到所有处理这个事件的实现类,然后调用所有就可以了。

public interface IEventHandler
where TEvent : Event{ void Handle(TEvent e); } public class HeadedEvent:Event { public string Name { get; set; } }

如果国际章的妈妈关注这个Event, 我们就实现一个GuoJiZhangMotherEventHandler

public class GuoJiZhangMotherEventHandler : IEventHandler
{ public void Handle(HeadedEvent e) { Console.WriteLine(e.Name+", Are you kidding me?"); } }

如果我等屁民也关心这个事件的话,我们只需要再实现一个 PiMingEventHandler

public class PiMingEventHandler:IEventHandler
{ public void Handle(HeadedEvent e) { Console.WriteLine(e.Name+", Guo Ji Zhang is your last wife?"); } }

看,我们可以任意增加关注事件的代码,不用修改原来的代码吧,说好的OCP没骗你吧? 那么问题来了,发出事件的人和接受事件的人怎么联系上的?在现实世界中,我们都是订阅报纸来看头条知道的,但是代码里我们就需要一个协调者了。如是我们就需要一个EventBus, 直接上代码吧

public void Head() { var NewsPaper = new NewsPaper("南都娱乐"); NewsPaper.WriteToHeader("汪峰"); RaiseEvent(new HeadedEvent {Name = "汪峰"}); } private void RaiseEvent(HeadedEvent headedEvent) { EventBus.Publish
(new HeadedEvent { Name = "汪峰" }); }

EventBus找出所有Handle这个事件的实现类,调用对应的Handle方法,我们可以通过Castle或者任何注入框架轻易的实现

public class EventBus{    public static void Publish
(T concreteEvent) where T: Event { var handlers = _container.ResolveAll
>(); foreach (var handle in handlers) { handle.Handle(concreteEvent); } } }

好了,哥只负责帮汪老师上头条,上完我发出了事件通知,谁关注谁自己处理去,我的代码也不用改。

我代码实现完了,如果各位还不知道如何实现一个同步的事件驱动架构,那拜托你们找个漂亮的妹子来问我。事件驱动架构我就只能帮你到这里了。

 

  • 作者: 王德水
  • 出处:
分类: ,
 
 
本文转自左正博客园博客,原文链接: ,如需转载请自行联系原作者
你可能感兴趣的文章
【月伴流星】Win7 SP1_x86/x64_2018.03多合一安装版
查看>>
Log4J的基本应用
查看>>
我的友情链接
查看>>
【NetApp】VASA 登录maintenance menu的方法
查看>>
我在百度运维的成长经历 之五
查看>>
让记录成为一种习惯
查看>>
我的友情链接
查看>>
lesson6 -SSH FTP
查看>>
工作上的重要数据被误删除了怎么办?
查看>>
题小七春游照
查看>>
课下参考三 使用光盘映像创建虚拟机并安装centos5.5系统视频
查看>>
通过xrdp协议远程连接 ubuntu虚拟机
查看>>
Linux网络安全技术与实现(第2版)第二章笔记(反向代理)
查看>>
linux运维之路第一篇章:决心书
查看>>
el-upload 上传文件和上传图片的基本用法
查看>>
esxi开启命令行模式以及命令开启虚拟机
查看>>
自动化运维Python系列之Memcache、Redis操作
查看>>
linux 安装sysstat使用iostat、mpstat、sar、sa
查看>>
我的友情链接
查看>>
在CDH5.14.4 中安装StreamSets与案例运行
查看>>