DDD

领域驱动设计

【DDD 如何设计】

1.请详细描述DDD的实现流程?

面向领域的软件设计方法 将业务知识和业务逻辑集成到软件设计中 提高软件系统的可维护性、可扩展性和可测试性 实现流程:➊明确系统解决的业务问题,确定业务领域的边界 ➋设计领域的模型(实体、值对象、聚合、领域服务和事件)➌统一语言(表达业务概念和业务规则)➍实现领域模型 (领域对象封装到聚合里,保证聚合内的对象保持一致性| 实现领域服务|实现领域事件来传递领域之间的消息)➎应用架构设计(基础设施层:数据持久化+外部访问。 表示层:返回结果。 应用层:协调领域对象的交互) ➏确保领域模型和业务需求的一致性

2. 如何理解领域驱动设计?

一种软件开发方法论 业务领域作为软件设计的核心 DDD认为,软件开发的核心是理解业务,而不是实现技术(在不使用DDD的软件开发过程中,来了一个需求,开发会首先考虑如何设计表结构,然后再根据表结构设计实体类以及对应的Service服务。但是在DDD中,提倡通过领域驱动设计,要先进行领域建模,最后在考虑持久化存储。) DDD思想:领域建模(抽象业务领域,领域对象、领域服务、领域事件) | 领域驱动架构(4层,清晰划分)

3. 什么是充血模型和贫血模型?

贫血模型: 将数据 行为 分离 | 数据由对象持有,而行为则由外部服务提供 充血模型的优点: 面向对象设计,具有良好的封装性和可维护性。 | 领域对象自包含业务逻辑,易于理解和扩展|可以避免过度依赖外部服务,提高系统的稳定性。 充血模型的缺点:需要对模型的理解才能更好的开发,上手成本高|对象间的协作可能增加,导致设计变得复杂。|对象的状态可能会变得不一致,需要特别注意。

4. 什么是聚合,什么是聚合根?

聚合是指将多个相关的对象或实体组合在一起形成一个单独的整体| 聚合根是聚合的对象,它代表了聚合的根实体

5. 什么是领域事件?

域内的模型发生了一些状态或者行为时,向外发出的一个通知 什么是实体,什么是值对象? 实体通常指具有唯一标识的具体对象或事物(如单据主表,Item表,对应数据库一行数据) | 值对象通常指没有唯一标识的对象或数据类型(比如单据主表有收件人消息)

6. DDD的分层架构是怎么样的?

接口 应用 领域(聚合,领域服务) 基础(db,事件总线,网关,缓存)

    1. 划分界限上下文:识别并划分出履约上下文、寻仓上下文、WMS上下文和物流上下文 , 时效作为核心- 领域。
    1. 定义聚合根:在履约上下文中,确定需求单和出库单为聚合根,负责维护自身状态和完整性。
    1. 设计领域服务:将复杂的寻仓规则引擎和承运商智能选择封装为领域服务,处理不归属于单个实体的业- 务逻辑。
    1. 明确领域事件:定义出库单已生成、出库单已妥投等关键领域事件,作为上下文间通信的契约。
    1. 建立防腐层:通过适配器与外部WMS系统和三方物流系统交互,隔离外部变化,防止外部模型污染领域- 模型。
    1. 编排应用服务:在应用层按“需求单->寻仓->打标->生成出库单->选承运商->下单”流程,协调各个- 领域对象和服务完成履约。
    1. 事件驱动状态同步:当接收到物流妥投消息时,更新本地出库单状态,并发布出库单已妥投领域事件,驱动下游业务。