实现领域驱动设计-DDD是什么

7/18/2021 ABPDDD

本系列文章,翻译至Implementing Domain Driven Design (opens new window)

# 领域驱动设计是什么

领域驱动设计 (DDD) 是一种通过将实现连接到不断发展的模型来满足复杂需求的软件开发方法;

DDD 适用于复杂领域大型应用,而不是简单的 CRUD 应用。它侧重于核心领域逻辑而不是基础架构细节。它有助于构建灵活、模块化和可维护的代码库。

# OOP 和 SOLID

实现 DDD 高度依赖于面向对象编程 (OOP) 和 SOLID (opens new window) 原则。实际上,它实现扩展了这些原则。因此,在真正实现 DDD 的同时,对 OOP 和 SOLID 的良好理解对您有很大帮助。

# DDD分层 和 整洁架构

基于领域驱动的解决方案有四个基本层;

image-20210718125925460

业务逻辑分为领域层和应用层两层,包含不同种类的业务逻辑;

  • 领域层实现了领域/系统的核心、用例独立的业务逻辑。
  • 应用层基于领域实现应用的用例。用例可以被认为是用户界面 (UI) 上的用户交互。
  • 表示层包含应用程序的 UI 元素(页面、组件)。
  • 基础设施层通过实现对第三方库和系统的抽象和集成来支持其他层。

相同的分层可以如下图所示,称为 Clean Architecture (opens new window),有时也称为Onion Architecture (opens new window)

Implementing_Domain_Driven_Design

在 Clean Architecture 中,每一层仅依赖于直接位于其内部的层。最独立的层显示在最里面的圆圈中,它是领域层。

# 核心构建块

DDD 主要关注领域和应用层,而忽略了表示和基础设施。它们被视为细节,业务层不应依赖于它们。

这并不意味着表示层和基础设施层不重要。它们非常重要。 UI 框架和数据库提供程序有自己的规则和最佳实践,您需要了解和应用这些规则和最佳实践。但是,这些不在 DDD 的主题中。

本节介绍领域和应用层的基本构建块。

# 领域层构建块

  • 实体:实体 (opens new window)是一个对象,具有自己的属性(状态、数据)和实现在这些属性上执行的业务逻辑的方法。实体由其唯一标识符 (Id) 表示。具有不同 Id 的两个实体对象被视为不同的实体。
  • 值对象:值对象 (opens new window)是另一种由其属性而非唯一 ID 标识的域对象。这意味着具有相同属性的两个值对象被视为同一个对象。值对象通常被实现为不可变的,并且通常比实体简单得多。
  • 聚合和聚合根:聚合 (opens new window)是由聚合根对象绑定在一起的一组对象(实体和值对象)。聚合根是具有一些附加职责的特定类型的实体。
  • 存储库(接口):存储库 (opens new window)是一个类似集合的接口,领域和应用层使用它来访问数据持久性系统(数据库)。它对业务代码隐藏了 DBMS 的复杂性。领域层包含存储库的接口
  • 领域服务:领域服务 (opens new window)是实现领域核心业务规则的无状态服务。实现依赖于多个聚合(实体)类型或一些外部服务的领域逻辑很有用。
  • 规约:规约 (opens new window)用于为实体和其他业务对象定义命名的、可重用的和可组合的过滤器。
  • 领域事件:领域事件 (opens new window)是一种在特定领域事件发生时以松散耦合的方式通知其他服务的方式。

# 应用层构建块

  • 应用服务:应用服务 (opens new window)是实现应用用例的无状态服务。应用程序服务通常获取并返回 DTO。它由表示层使用。它使用和协调域对象来实现用例。用例通常被视为一个工作单元。
  • 数据传输对象 (DTO):DTO (opens new window) 是一个简单的对象,没有任何业务逻辑,用于在应用程序层和表示层之间传输状态(数据)。
  • 工作单元 (UOW):工作单元 (opens new window)是原子性工作,应该作为事务单元来完成。 UOW 中的所有操作都应该在成功时一起提交或在任何一个失败时一起回滚。

作者:Gerry Ge

出处:实现领域驱动设计-DDD是什么 (opens new window)

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际 (opens new window)」许可协议进行许可。

转载请注明出处

Last Updated: 2/24/2022, 3:11:39 PM