日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

事件驱动下

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

前言

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

實(shí)現(xiàn)思路

發(fā)出事件

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

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

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

那么如何訂閱事件

其實(shí)很簡(jiǎn)單,因?yàn)槲覀円獙?shí)現(xiàn)的是同步的事件,我們只需要找到所有處理這個(gè)事件的實(shí)現(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)注這個(gè)Event, 我們就實(shí)現(xiàn)一個(gè)GuoJiZhangMotherEventHandler

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

如果我等屁民也關(guān)心這個(gè)事件的話,我們只需要再實(shí)現(xiàn)一個(gè) 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)實(shí)世界中,我們都是訂閱報(bào)紙來看頭條知道的,但是代碼里我們就需要一個(gè)協(xié)調(diào)者了。如是我們就需要一個(gè)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這個(gè)事件的實(shí)現(xiàn)類,調(diào)用對(duì)應(yīng)的Handle方法,我們可以通過Castle或者任何注入框架輕易的實(shí)現(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); } } }

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

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

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

總結(jié)

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

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