领域驱动设计
【DDD 如何设计】
1.请详细描述DDD的实现流程?
面向领域的软件设计方法 将业务知识和业务逻辑集成到软件设计中 提高软件系统的可维护性、可扩展性和可测试性 实现流程:➊明确系统解决的业务问题,确定业务领域的边界 ➋设计领域的模型(实体、值对象、聚合、领域服务和事件)➌统一语言(表达业务概念和业务规则)➍实现领域模型 (领域对象封装到聚合里,保证聚合内的对象保持一致性| 实现领域服务|实现领域事件来传递领域之间的消息)➎应用架构设计(基础设施层:数据持久化+外部访问。 表示层:返回结果。 应用层:协调领域对象的交互) ➏确保领域模型和业务需求的一致性
2. 如何理解领域驱动设计?
一种软件开发方法论 业务领域作为软件设计的核心 DDD认为,软件开发的核心是理解业务,而不是实现技术(在不使用DDD的软件开发过程中,来了一个需求,开发会首先考虑如何设计表结构,然后再根据表结构设计实体类以及对应的Service服务。但是在DDD中,提倡通过领域驱动设计,要先进行领域建模,最后在考虑持久化存储。) DDD思想:领域建模(抽象业务领域,领域对象、领域服务、领域事件) | 领域驱动架构(4层,清晰划分)
3. 什么是充血模型和贫血模型?
贫血模型: 将数据 行为 分离 | 数据由对象持有,而行为则由外部服务提供 充血模型的优点: 面向对象设计,具有良好的封装性和可维护性。 | 领域对象自包含业务逻辑,易于理解和扩展|可以避免过度依赖外部服务,提高系统的稳定性。 充血模型的缺点:需要对模型的理解才能更好的开发,上手成本高|对象间的协作可能增加,导致设计变得复杂。|对象的状态可能会变得不一致,需要特别注意。
4. 什么是聚合,什么是聚合根?
聚合是指将多个相关的对象或实体组合在一起形成一个单独的整体| 聚合根是聚合的对象,它代表了聚合的根实体
5. 什么是领域事件?
域内的模型发生了一些状态或者行为时,向外发出的一个通知 什么是实体,什么是值对象? 实体通常指具有唯一标识的具体对象或事物(如单据主表,Item表,对应数据库一行数据) | 值对象通常指没有唯一标识的对象或数据类型(比如单据主表有收件人消息)
6. DDD的分层架构是怎么样的?
接口 应用 领域(聚合,领域服务) 基础(db,事件总线,网关,缓存)
-
- 划分界限上下文:识别并划分出履约上下文、寻仓上下文、WMS上下文和物流上下文 , 时效作为核心- 领域。
-
- 定义聚合根:在履约上下文中,确定需求单和出库单为聚合根,负责维护自身状态和完整性。
-
- 设计领域服务:将复杂的寻仓规则引擎和承运商智能选择封装为领域服务,处理不归属于单个实体的业- 务逻辑。
-
- 明确领域事件:定义出库单已生成、出库单已妥投等关键领域事件,作为上下文间通信的契约。
-
- 建立防腐层:通过适配器与外部WMS系统和三方物流系统交互,隔离外部变化,防止外部模型污染领域- 模型。
-
- 编排应用服务:在应用层按“需求单->寻仓->打标->生成出库单->选承运商->下单”流程,协调各个- 领域对象和服务完成履约。
-
- 事件驱动状态同步:当接收到物流妥投消息时,更新本地出库单状态,并发布出库单已妥投领域事件,驱动下游业务。