領域驅動設計系列 (四):事件驅動下

前言

上一篇說到爲何要使用事件驅動,可是隻有概念是不夠的,咱們要代碼呀!記得臉書的老總說過: "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

相關文章
相關標籤/搜索