源自圣杰 https://www.cnblogs.com/sheng-jie/p/6931646.html DDD理论系列文章
DDD综合软件系统分析和设计的面向对象建模的方法
通用语言:通过团队交流达成共识 能简单清晰准确 传递业务规则的语言(文字 图片)
《实现领域驱动设计》书中有一个简单的例子(P238)
系统必须对User进行认证,并且只有当Tenant(租户)处于激活状态时才能对User进行认证:
bool anthentic = false;
User user = _userRepository().FindUserByTenantIdAndUserName(tenantId, userName);
if(user!=null)
{
authentic = user.IsAuthentic(password);
}
return authentic;
以上代码:没有表达出“认证”这个过程,未体现“检查Tenant是否处于激活状态”前提
改进:
bool anthentic = false;
Tenant tenant = _tenantRepository.FindTenantById(tenantId);
//检查租户是否激活
if(tenant!=null&&tenant.IsActive){
User user = _userRepository.FindUserByTenantIdAndUserName(tenantId, userName);
if(user!=null)
{
authentic = tenant.Authenticate(user, password);//租户对用户进行认证
}
}
return authentic;
领域
问题域,同一领域同一问题,确定领域 核心业务 要解决的关键问题,问题的范围边界基本确定
子域
领域拆分,复杂拆成小问题 各个击破 :核心域 通用子域 支撑子域
通用子域
通用服务,服务于整个业务领域,如日志子域,所有子域的消费者
支撑子域
某些重要业务而非核心业务,关注于业务的某一方面,来支撑完善业务系统
核心域
关键字,目的,宗旨,核心价值
限界上下文
限界:界限,范围
上下文:语境
上下文
划分子域,一个子域一个上下文,如果一个子域多个 是不是继续划分 销售子域 销售上下文
领域逻辑:据业务知识划分,将电商项目划分订单 商品 促销 物流 售后等限界上下文
技术实现:如为解决系统高并发,引入缓存 将缓存服务抽离独立限界上下文做支撑
团队合作:以人为本的思想
领域模型
领域:要解决的问题
模型:解决方案;对于某个实际问题或客观事物、规律进行抽象后的一种形式化表达方式
领域模型:对软件系统中要解决问题的抽象;业务中涉及到的概念以面向对象思想抽象出实体,对应的方法属性 实体间关系,关系以某种形式展现
分析阶段:all参与人员业务需求分析,提前业务规则 流程关键词汇和概念 发现领域概念,不断丰富和精准
设计阶段:通用语言交流,将领域概念进行领域模型设计,面向对象思想抽象出实体,方法 属性 实体间关系
实现阶段:据确定的领域模型代码实现
实体
唯一且可变
实体 = 唯一身份标识 + 可变性【状态(属性) + 行为(方法或领域事件或领域服务)】
值对象
值+对象=将一个值以对象方式表述一个具体的固定不变的概念
应用服务&领域服务
应用层:协调展现层于领域层,协调业务对象执行特定应用程序任务,不含业务逻辑
领域层:表达业务概念,状态,规则
应用服务表述应用行为
可进行安全认证,权限校验,持久化事务控制,向其他系统发送基于事件的消息通知
具体操作开始到结束个环节,即表达用例和用户故事,负责编排转发,隐藏领域层复杂性内部实现机制
领域服务表述领域行为
对应用行为细化,处理具体环节,协调*领域对象完成某个业务操作;(领域对象:实体和值对象 负责单一操作)
领域事件
捕获领域中发生的具有业务价值的一些事情
=事件发布+事件存储+事件分发+事件处理;https://www.jianshu.com/p/c10b7fd9bec1
聚合
将相关联的领域对象显式分组,表达整体概念,支持领域模型的行为和不变性,同时充当一致性和事务性边界
目的:封装业务和保证聚合内领域对象数据一致性
关联关系
关联关系作用是?谁需要?
简化:基于业务用例建立必要关联,双向转单向
聚合内实现事务一致性,聚合外实现最终一致性 https://www.jianshu.com/p/bab59c6e5a6b
工厂
将对象使用和创建分开,对象的创建逻辑明确封装到工厂对象中去
工厂目标:隐藏对象复杂创建逻辑,清楚表达对象实例化意图
封装内部结构,隐藏创建逻辑
谢谢分享https://www.cnblogs.com/sheng-jie/p/6931646.html 还需要继续学习