日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

事件驱动下

發(fā)布時間:2024/9/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事件驱动下 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

上一篇說到為什么要使用事件驅(qū)動,但是只有概念是不夠的,我們要代碼呀!記得臉書的老總說過: “Talk is cheap, Show me the code!”

實現(xiàn)思路

發(fā)出事件

事件顧名思義就是一件事情發(fā)生了,比如我要上頭條,這不是一個事件,這事一個Command, HeadCommand, 而我上頭條了這就是一個事件HeadedEvent,事件就是一件事情已經(jīng)發(fā)生了。 好,先來一個偽代碼

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

所以我們只需在代碼里RaiseEvent就可以了。

那么如何訂閱事件

其實很簡單,因為我們要實現(xiàn)的是同步的事件,我們只需要找到所有處理這個事件的實現(xiàn)類,然后調(diào)用所有就可以了。

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

如果國際章的媽媽關(guān)注這個Event, 我們就實現(xiàn)一個GuoJiZhangMotherEventHandler

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

如果我等屁民也關(guān)心這個事件的話,我們只需要再實現(xiàn)一個 PiMingEventHandler

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

看,我們可以任意增加關(guān)注事件的代碼,不用修改原來的代碼吧,說好的OCP沒騙你吧? 那么問題來了,發(fā)出事件的人和接受事件的人怎么聯(lián)系上的?在現(xiàn)實世界中,我們都是訂閱報紙來看頭條知道的,但是代碼里我們就需要一個協(xié)調(diào)者了。如是我們就需要一個EventBus, 直接上代碼吧

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

EventBus找出所有Handle這個事件的實現(xiàn)類,調(diào)用對應(yīng)的Handle方法,我們可以通過Castle或者任何注入框架輕易的實現(xiàn)

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

好了,哥只負責(zé)幫汪老師上頭條,上完我發(fā)出了事件通知,誰關(guān)注誰自己處理去,我的代碼也不用改。

我代碼實現(xiàn)完了,如果各位還不知道如何實現(xiàn)一個同步的事件驅(qū)動架構(gòu),那拜托你們找個漂亮的妹子來問我。事件驅(qū)動架構(gòu)我就只能幫你到這里了。

  • 作者: 王德水
  • 出處:http://deshui.wang

總結(jié)

以上是生活随笔為你收集整理的事件驱动下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。