mac_girl

DDD-基础知识

题外话:
数据元
定义:也称数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,将若干个具有相关性的数据元按照一定的次序组成一个整体结构即为数据模型
数据元的基本属性
1.标识类属性:适用于数据元标识的属性(包括中文名称、英文名称、中文全拼、内部标识符、版本、注册机构、同义名称、语境)
2.定义类属性:描述数据元语义方面的属性(包括定义、对象类词、特性词、应用约束)
3.关系类属性:描述数据元直接相互关联(或)数据元与模式、数据元概念、对象、实体之间关联的属性。包括分类方案、分类方案值、关系
4.表示类属性:描述数据元表示方面的属性(包括表示词、数据类型、数据格式、值域、计量单位)
5.管理类属性:描述数据元管理与控制方面的属性(包括状态、提交机构、批准日期、备注)
数据元的基本组成
组成:对象类+特性+表示

元数据
定义:用来描述数据的内容、使用范围、质量、管理方式、数据所有者、数据来源着、分类等信息
元数据:描述数据的数据,对数据及信息资源的描述性信息,或者说提供某种资源有关信息的数据结构
特性
1.元数据一经建立便可共享
2.元数据首先是一种编码体系

DDD核心思想:
模型驱动设计

  1. 统一语言
  2. 领域服务
  3. 领域事件
  4. 实体
  5. 值对象
  6. 分层架构
  7. 限界上下文

实体
定义:有身份标识ID、属性、行为
ID类型:
1.通用类型:没有业务含义
2.领域类型:有业务含义
属性:
1.原子属性(整型、布尔、字符串)
2.自定义类型
行为:
1.状态变更行为(有副作用)
2.自给自足行为(无副作用)
3.互为协作行为
实体是通过ID来定义的,要着重考虑ID在对象生命周期的连续性和唯一性

值对象
值对象的判断依据:
1.相等性:
1.1 属性值变化,就产生了另一个完全不同的对象。
1.2 无需管理生命周期,可随时创建和销毁
2.不变性
2.1 值对象是不可变类,属性不可更改
3.独立性
3.1 值对象依附实体存在,需要单独存在就需要升级为实体
在不同的上下文,同一领域概念值对象可以定义为不同设计类型
值对象的行为
1.自我验证(非空、取值范围、类型)
2.自我组合(重量的单位和数值)
3.自我运算

关联
关联的弊端:过度的关联使得元素间的耦合度变高,尽量避免双向关联
如何使得关联更易于控制?
1.指定一个方向关联
2.通过限定符来减少多重的关联
3.清楚不必要的关联

聚合
聚合的实现规则:
1.根实体具有全局标识
2.聚合以外的任何对象不可以持有任何其他内部对象的引用
聚合的invariant(不变性)
1.实体和聚合应确保它们自己的一致性
2.聚合根保证同一聚合内多实体间一致性
3.如果实体需要进入无验证状态,考虑使用不同的对象模型
4.如果需要创建多个相关对象(如聚合),只有完成创建所有对象之后才有效,考虑使用工厂模式
5.在大多数情况下,客户端采用冗余验证是不错的选择
invariant验证的方法
1.根据模型的数据注释来验证(如 Required,MaxLength)
2.通过规格模式和通知模式
3.域延迟验证
4.双重验证(在DTO上使用字段级别验证)
聚合划分原则
1.完整性
2.独立性
3.不变量
4.一致性
5.最高原则
聚合的关系
1.关联关系:通过ID进行引用,而不是对象引用
2.依赖关系:同一限界上下文内,允许聚合根实体直接引用另一聚合根实体
聚合的生命周期管理
通过工厂来管理聚合(工厂方法、抽象工厂、构造器(builder)模式)
谁来担任工厂?
1.由被依赖的聚合担任工厂(由另一个聚合创建)
2.专门的聚合工厂(聚合具有多态时需要专门的工厂)
3.聚合自身的工厂(自己创建自己)
4.消息契约模型或装配器作为工厂
5.Builder组装聚合(有多个构造参数时考虑)
聚合的持久化
由仓储负责聚合的持久化,一个聚合对应一个仓储

领域服务
在某些情况下,最清楚、最实用的设计会包含一些特殊操作,这些操作从概念上讲不属于任何对象。
领域服务的特点:
1.领域服务处理的是领域中的对象,比如实体、值对象等
2.领域服务是负责对领域中一系列对象的编排处理
3.当我们发现一个操作无法赋予一个实体或者值对象,且该操作又对业务流程很重要时,我们往往需要使用领域服务
4.领域服务中的操作,从领域的角度来看,它是
领域服务VS应用服务
应用服务的特点
1.用来表达用例和用户故事的主要手段
2.应用层通过应用服务接口来暴露系统的全部功能,负责编排和转发,它将要实现的功能委托给一个或多个领域对象实现,本身只负责业务用例的执行顺序以及结果拼装
领域服务的特征
1.领域行为需要多个领域实体参与协作
2.领域行为与状态无关
3.领域行为需要外部资源(例:DB)
领域服务的职责
1.封装聚合的变化
2.负责聚合之间的协作
3.负责聚合与南向网关端口之间的协作

领域事件
领域事件是什么?
一个领域事件是发生在一个特定领域的事件,是你希望在同一个领域中其他部分知道并产生后续动作的事件

1.领域事件的命名必须清晰传递领域概念
2.命名采用动词的过去时态
3.事件是不变类
4.在模型元数据中定义领域事件元数据
领域事件的建模范式
1.使用observer / event bus模式
2.涉及限界上下文之间的协作,需定义集成事件(应用事件)
领域事件和集成事件的区别
1.集成事件消息始终异步发送、跨进程和计算机传达
2.领域事件从当前运行的域引发,需要在相同的领域中发生副作用

仓储
仓储的作用
1.提供查找和提取持久化对象的方法
2.把生命周期管理和有关的复杂基础设施封装起来
为什么需要仓储
1.使用SQL查询,得到一个记录集。对象成为了承载记录集的容器,模型的焦点丢失
2.开发人员会绕过模型特性(聚合),直接把需要的数据取出来
3.数据访问技术很复杂,会使得代码变得混乱
4.代码不再描绘业务,只是在检索数据
5.暴露了基础数据结构和数据库访问机制
仓储是领域层,不是DAO层(资源层,是数据库资源的具体体现)
仓储模式
仓储用来持久化聚合,创建聚合(缺点:会导致领域对象与我们的基础架构紧密的耦合)
1.为每种需要全局访问的对象类型(聚合)创建一个仓储对象
2.提供该类型的所有实例的集合
3.提供一个全局访问接口
4.把对数据存储的实际插入和删除封装起来
4.提供筛选对象的方法,给客户返回指定的实例或实例集合
5.将对象存储和访问的工作交给仓储完成

工厂
定义:创建、重组复杂的对象聚合,并保持内部结构的良好封装

仓储和工厂的关系
1.工厂是对象生命周期的开始,仓储帮助管理生命周期的中间和结束
2.

深层模型
隐含概念变成显示概念:将约束分解出来,使之成为一个对象

posted on 2021-12-06 14:07  宇宙美少女  阅读(433)  评论(0)    收藏  举报

导航