上一篇说到为何要使用事件驱动,可是只有概念是不够的,咱们要代码呀!记得脸书的老总说过: "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