事件驱动下
前言
上一篇說到為什么要使用事件驅(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é)