DDD Domain Drive Design

源自圣杰 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 还需要继续学习

发布了431 篇原创文章 · 获赞 155 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/100554962
ddd