领域驱动设计系列 (四):事件驱动下

前言

上一篇说到为什么要使用事件驱动,但是只有概念是不够的,我们要代码呀!记得脸书的老总说过: "Talk is cheap, Show me the code!"

实现思路

发出事件

事件顾名思义就是一件事情发生了,比如我要上头条,这不是一个事件,这事一个Command, HeadCommand, 而我上头条了这就是一个事件HeadedEvent,事件就是一件事情已经发生了。 好,先来一个伪代码

   public void Head()
    {
        var NewsPaper = new NewsPaper("南都娱乐");
        NewsPaper.WriteToHeader("汪峰");

        RaiseEvent(new HeadedEvent {Name = "汪峰"});
    }

所以我们只需在代码里RaiseEvent就可以了。

那么如何订阅事件

其实很简单,因为我们要实现的是同步的事件,我们只需要找到所有处理这个事件的实现类,然后调用所有就可以了。

public interface IEventHandler<TEvent> where TEvent : Event
{
    void Handle(TEvent e);
}

public class HeadedEvent:Event
{
    public string Name { get; set; }
}

如果国际章的妈妈关注这个Event, 我们就实现一个GuoJiZhangMotherEventHandler

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, 直接上代码吧

    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或者任何注入框架轻易的实现

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);
        }
    }
}

我代码实现完了,如果各位还不知道如何实现一个同步的事件驱动架构,那拜托你们找个漂亮的妹子来问我。事件驱动架构我就只能帮你到这里了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,旨在解决复杂业务领域的软件开发问题。DDD强调将业务领域作为软件设计和开发的核心,通过深入理解业务领域的知识和规则,将其准确地映射到软件模型中。 在DDD中,将业务领域划分为多个领域模型,每个领域模型都包含了该领域的核心概念、业务规则和行为。通过使用领域模型,开发团队可以更好地理解业务需求,并将其转化为可执行的软件代码。 DDD提供了一系列的设计原则和模式,帮助开发团队构建高度可维护、可扩展和可测试的软件系统。其中一些重要的概念和技术包括: 1. 领域模型:领域模型是对业务领域的抽象和建模,它包含了实体、值对象、聚合根、领域服务等概念,用于描述业务领域的核心概念和关系。 2. 聚合根:聚合根是领域模型中的一个重要概念,它是一组相关对象的根实体,负责维护整个聚合内部的一致性和业务规则。 3. 领域事件:领域事件是领域模型中发生的重要事实或状态变化,它可以被其他领域模型订阅和处理,用于实现领域间的解耦和协作。 4. 领域驱动设计的分层架构:DDD提倡使用分层架构来组织软件系统,将领域模型放在核心层,与应用层、基础设施层等进行交互。 5. 领域驱动设计的战术模式:DDD提供了一些战术模式,如聚合、工厂、仓储等,用于解决领域模型的复杂性和持久化等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值