DDD架构最全详解(万字图文总结)

DDD架构最全详解(万字图文总结)

DDD是现在非常火热的架构设计,而且大厂面试也经常考察,下面我就全面来详解DDD架构@mikechen

DDD

DDD,全程是领域驱动设计(Domain-Driven Design,简称 DDD),是一种软件开发方法论。

DDD,主要通过深刻理解业务领域,并将其转化为技术,来实现复杂业务系统的高效设计、和开发。

DDD架构最全详解(万字图文总结)

DDD的作用主要体现在如下4大方面:

第一:促进业务、和技术团队的沟通。

比如:通过建立统一的领域语言,DDD帮助业务、和技术团队,更好地沟通和理解业务需求,减少误解、和沟通成本。

第二:提高代码质量、和可维护性。

比如:DDD强调清晰的领域模型、和边界,鼓励使用面向对象的设计原则,提升代码的可读性、可维护性、和可扩展性。

第三:聚焦业务价值

DDD将关注点放在业务逻辑、和需求上,确保开发的每个功能,都是为了解决实际业务问题,从而最大化业务价值。

第四:应对复杂性

通过划分子领域、和界限上下文(Bounded Context),DDD能够有效地管理、和应对复杂业务领域中的复杂性。

 

DDD架构

DDD架构通常分为四层结构,这四层各自承担不同的职责,共同构成一个完整的领域驱动设计系统。

如下图所示:

DDD架构最全详解(万字图文总结)

传统的方式,经常会分为三层架构,一般会包含:表示层、业务逻辑层、与数据访问层。

如下:

表示层(Presentation Layer)

  • 功能:处理用户界面和用户输入。
  • 职责:展示数据,处理用户交互,将用户的请求传递给业务逻辑层,并显示结果。

业务逻辑层(Business Logic Layer)

  • 功能:包含应用程序的核心业务逻辑和规则。
  • 职责:处理业务逻辑,实现应用程序的核心功能,调用数据访问层进行数据操作。

数据访问层(Data Access Layer)

  • 功能:处理与数据库或其他存储系统的交互。
  • 职责:执行 CRUD 操作,管理数据持久化,封装对存储的访问逻辑。

但是DDD架构,会分层四层架构,这是与传统架构最大的区别。

1.用户界面层

主要:处理用户界面、和用户输入。

同传统架构,展示数据,处理用户交互,将用户的请求传递给应用层,并显示结果。

 

2.应用层

应用层:主要实现应用程序的用例、和业务流程,确保应用程序的工作流正确无误。

与传统业务逻辑层的区别:应用层关注的是应用程序的操作、和流程,而不是具体的业务逻辑。

它不包含复杂的业务规则,而是调用领域层中的业务逻辑来完成任务。

 

3.领域层

领域层是 DDD 的核心层,包含:领域模型、和业务逻辑,这是与传统架构最大的区别点。

领域层,主要复制:定义、和实现领域模型,主要包含:业务逻辑、和领域规则。

比如:包含实体、值对象、聚合根、领域服务。。。。。等。

如下图所示:

DDD架构最全详解(万字图文总结)

1).实体(Entity)

实体:是领域模型中具有唯一标识符的对象。

实体通过唯一标识符,(如ID)来区分其他实体,即使它们的其他属性相同

实体在系统中有自己的生命周期,可以被创建、修改和删除。

假设,我们在一个电商系统中设计订单系统,其中的订单就是一个实体。

public class Order {
    public Guid Id { get; private set; }
    public DateTime OrderDate { get; private set; }
    public string CustomerId { get; private set; }
    public List<OrderItem> Items { get; private set; }
    
    // 其他属性和方法
    
    public void AddItem(OrderItem item) {
        // 添加商品到订单
    }
}

 

2).值对象(Value Object)

值对象,代表某种特定的概念、或属性,并且通常是不可变的。

值对象一旦创建,其属性值不会改变,如果需要更改,通常会创建一个新的值对象。

举一个例子,在电商系统中,Money 类可以作为值对象来表示货币金额。

public class Money {
    public decimal Amount { get; private set; }
    public string Currency { get; private set; }
    
    public Money(decimal amount, string currency) {
        Amount = amount;
        Currency = currency;
    }

 

3).聚合(Aggregate)

聚合是一个领域模型中的重要概念,它是一个实体的根,负责管理:聚合内所有的实体、和值对象。

举一个例子,还是电商的场景,比如:订单聚合,就可以包含:订单、物流、发货地址…等。

public class Order {
    public Guid Id { get; private set; }
    public DateTime OrderDate { get; private set; }
    public string CustomerId { get; private set; }
    public List<OrderItem> Items { get; private set; }
    
    // 确保聚合内的一致性
    public void AddItem(OrderItem item) {
        // 添加商品到订单
    }
    
    public void RemoveItem(OrderItem item) {
        // 从订单中移除商品
    }
}

 

4).领域服务(Domain Service)

领域服务,通常用于处理跨越多个聚合的业务逻辑,或者,处理那些没有明显的归属到某个特定对象的逻辑。

领域服务通常包含:复杂的业务逻辑,它们负责协调多个领域对象之间的交互。

比如:在电商系统中,OrderService 可以作为领域服务来处理跨多个订单的复杂业务逻辑。

 

5).领域事件(Domain Event)

领域事件:用于表示领域模型中发生的业务事件。

例如,当订单被创建时,可以触发:库存管理系统,更新库存…等事件。

以及,当用户信息被更新时,可以发布领域事件,以同步到其他相关系统。

 

4.基础设施层(Infrastructure Layer)

与传统数据访问层的区别,基础设施层不仅包括数据访问,还包括其他技术实现,如文件存储、消息队列等。

它与领域层和应用层解耦,以提供对底层技术的支持。

提供持久化、消息传递、网络通信…等底层支持功能,比如:数据库访问、外部系统集成、日志记录…..等。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧