上一篇說到爲何要使用事件驅動,可是隻有概念是不夠的,咱們要代碼呀!記得臉書的老總說過: "Talk is cheap, Show me the code!"架構
事件顧名思義就是一件事情發生了,好比我要上頭條,這不是一個事件,這事一個Command, HeadCommand, 而我上頭條了這就是一個事件HeadedEvent,事件就是一件事情已經發生了。 好,先來一個僞代碼框架
public void Head() { var NewsPaper = new NewsPaper("南都娛樂"); NewsPaper.WriteToHeader("汪峯"); RaiseEvent(new HeadedEvent {Name = "汪峯"}); }
因此咱們只需在代碼裏RaiseEvent就能夠了。code
其實很簡單,由於咱們要實現的是同步的事件,咱們只須要找到全部處理這個事件的實現類,而後調用全部就能夠了。事件
public interface IEventHandler<TEvent> where TEvent : Event { void Handle(TEvent e); } public class HeadedEvent:Event { public string Name { get; set; } }
若是國際章的媽媽關注這個Event, 咱們就實現一個GuoJiZhangMotherEventHandlerget
public class GuoJiZhangMotherEventHandler : IEventHandler<HeadedEvent> { public void Handle(HeadedEvent e) { Console.WriteLine(e.Name+", Are you kidding me?"); } }
若是我等屁民也關心這個事件的話,咱們只須要再實現一個 PiMingEventHandler同步
public class PiMingEventHandler:IEventHandler<HeadedEvent> { public void Handle(HeadedEvent e) { Console.WriteLine(e.Name+", Guo Ji Zhang is your last wife?"); } }
看,咱們能夠任意增長關注事件的代碼,不用修改原來的代碼吧,說好的OCP沒騙你吧? 那麼問題來了,發出事件的人和接受事件的人怎麼聯繫上的?在現實世界中,咱們都是訂閱報紙來看頭條知道的,可是代碼裏咱們就須要一個協調者了。如是咱們就須要一個EventBus, 直接上代碼吧string
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這個事件的實現類,調用對應的Handle方法,咱們能夠經過Castle或者任何注入框架輕易的實現it
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); } } }
好了,哥只負責幫汪老師上頭條,上完我發出了事件通知,誰關注誰本身處理去,個人代碼也不用改。ast
我代碼實現完了,若是各位還不知道如何實現一個同步的事件驅動架構,那拜託大家找個漂亮的妹子來問我。事件驅動架構我就只能幫你到這裏了。class