原文:Domain Driven Design and Development In Practice (infoq.com)
背景
领域驱动设计(DDD)是指将业务领域概念映射到软件构件中。有关这一主题的大多数著作和文章都是以 Eric Evans 的《领域驱动设计》一书为基础,主要从概念和设计的角度论述领域建模和设计问题。这些著作讨论了领域驱动设计的主要元素,如实体、价值对象、服务等,或讨论了无处不在的语言、有界上下文和防破坏层等概念。
我们将研究技术主管和架构师可以在实施工作中使用的指南、最佳实践、框架和工具。领域驱动设计和开发还受到多个架构、设计和实现方面的影响,例如:
- 业务规则
- 坚持
- 缓存
- 事务管理
- 安全
- 代码生成
- 测试驱动开发
- 重构
领域模型提供以下的好处:
1. 它帮助团队在公司的业务和 IT 相关人员之间创建一个通用模型,团队可以使用该模型来传达有关业务需求、数据实体和流程模型的信息。
2. 该模型是模块化的、可扩展的且易于维护的,因为设计反映了业务模型。
3. 它提高了业务域对象的可重用性和可测试性。
项目管理
域建模项目通常包括以下步骤:
- 首先对业务流程进行建模和文档记录。
- 选择一个候选业务流程,并与业务领域专家合作,使用通用语言对其进行记录。
- 确定候选业务流程所需的所有服务。这些服务本质上可以是原子的(单步)或编排的(带或不带工作流的多步)。它们也可以是业务(例如承保或融资)或基础设施(例如电子邮件或工作安排)。
- 标识并记录上一步中标识的服务使用的对象的状态和行为。
架构
典型的企业应用程序体系结构由以下四个概念层组成:
- 用户界面(表示层):负责向用户呈现信息并解释用户命令。
- 应用层:此层协调应用程序活动。它不包含任何业务逻辑。它不保存业务对象的状态,但可以保存应用程序任务进度的状态。
- 域层:此层包含有关业务域的信息。业务对象的状态保存在此处。业务对象的持久性及其可能的状态被委托给基础结构层。
- 基础架构层:此层充当所有其他层的支持库。它提供层之间的通信,实现业务对象的持久性,包含用户界面层的支持库等。
依赖注入
DI 是将配置和依赖项代码移出域对象的好方法。此外,域类对数据访问对象 (DAO) 类和服务类对域类的设计依赖性使 DI 成为 DDD 实现中的“必备项”。DI 通过将其他对象(如存储库和服务)注入到域对象中,促进了更简洁和松散耦合的设计。
在示例应用程序中,服务对象 (FundingServiceImpl) 使用 DI 注入实体对象(贷款、借款人和融资请求)。此外,实体通过 DI 引用存储库。类似地,其他 Java EE 资源(如 DataSource、Hibernate Session Factory 和 Transaction Manager)也注入到服务和存储库对象中。