![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
领域驱动设计
文章平均质量分 70
领域驱动设计教程
dabusidede
Github:https://github.com/IceEmblem,
Word文档文章:https://github.com/IceEmblem/LearningDocuments
展开
-
3 CQRS Saga 模式
概念总线:负责发送命令、事件、持久化Saga命令:描述一个命令事件:描述一个事件处理器:处理命令或事件Saga:代表一个流程,是由完成一个流程的一系列处理器组成什么是SagaSaga代表一个流程如下订单流程下订单包含如下命令和事件:下订单命令:用于开启saga流程,此时saga被创建并持久化(如保存到数据库中),用户点击“下单”时,发送一个Http请求触发该命令,该命令会发送“检查商品库存命令”检查商品库存命令:这里会检查商品库存,如果库存充足,则创建“订单聚合”,状态为未支付,并原创 2020-08-17 12:00:13 · 3695 阅读 · 0 评论 -
2 Saga 模式介绍
原文地址:http://www.360doc.com/content/17/1121/14/203871_705844975.shtml什么是SagaSaga是什么Saga是什么?Saga的定义是“长时间活动的事务”(Long Lived Transaction,后文简称为LLT)。但Saga时间跨度并不重要,有时候甚至只有几秒钟。Saga往往由多个外部子事务构成,需要通过多次外部系统的消息交互,才能将整体事务从开始迁移到结束状态ACID事务 - 要么一起成功,要么一起失败。但是LLT.转载 2020-08-17 11:50:56 · 517 阅读 · 0 评论 -
1 整体架构介绍
原文地址:https://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html什么是CQRS(命令查询分离)对应更改数据的操作,我们不返回数据,对应查询数据的操作,我们不更改数据CQRS将系统分为命令与查询两个部分,我们暂且称为 命令项目 查询项目命令:不返回任何结果(void),但会改变对象的状态。查询:返回结果,但是不会改变对象的状态CQRS与数据库命令项目使用主数据库,用于写入数据查询项目使用从数据库,用于查收数据CQRS与架构命令项目转载 2020-08-15 13:14:48 · 420 阅读 · 0 评论 -
业务逻辑去处 —— 聚合,Manager,领域服务,应用服务
一段业务逻辑到底应该放在那,以下是我个人的以下判断,如果意见不同,可以评论指出哈聚合,Manager,领域服务是领域层常见的3个对象,一段领域逻辑应该放在聚合,Manager还是领域服务中还是应用服务中?如下判断注:这里所说的Manager是UserManager,RoleManager,PermissManager等相对于单个聚合的对象,可以把他当作一个仓库处理放在应用服务还是领域层?需要对多个聚合进行操作1.如果逻辑的步骤是可分开的,那么放在应用层,如下实例逻辑:修改手机号,修改备注用户可原创 2020-09-19 23:15:16 · 1223 阅读 · 0 评论 -
导航属性在哪加载
如果你使用ORM框架,你会使用导航属性加载关联实体,那么在哪加载,加载的边界又是在哪,以下为个人观点对于读命令:应用服务知道自己要读什么,所以导航属性在应用服务加载对于写命令:应用服务不知道领域层逻辑,所以导航属性由领域层加载,如果你在应用服务加载了导航属性,那么你是不是错把领域服务当作应用服务了呢?对于跨越聚合的导航属性:如聚合A指向聚合B,那么应在A中获取B的Id,然后用B的仓库获取B...原创 2020-08-12 12:46:53 · 218 阅读 · 0 评论 -
接口与 Dto 设计
以下为个人观点,给出了基本增删改查接口的设计,如有不同观点,可以指正:Dto与查询接口设计Dto设计:为每个实体建立一个对应的Dto列表查询:返回聚合根的Dto列表或自定义的Dto单个实体查询:返回整个聚合的Dto或自定义的Dto命令接口设计以下是基本的命令接口(增删改),根据业务逻辑是否允许如下操作进行添加增加:增加一个聚合根修改:前端发送整个聚合,后端修改整个聚合删除:删除整个聚合这样设计的原因是为了减少接口的数量,前提是聚合允许这样操作,但并不是每个聚合都允许这样操作,例如用户聚合原创 2020-08-12 12:41:42 · 1198 阅读 · 0 评论 -
领域,上下文,子域关系图
原创 2020-08-12 12:37:04 · 905 阅读 · 0 评论 -
领域驱动设计 各个层的职责
DDD的分层图在百度有很多,百度一下即可表示层:接收用户的指令,显示信息给用户,这里的用户不一定是个人,可以是另一台计算机系统权限检查在表示层应用层:应用层尽量简单,不包含业务规则与知识,应用层调用领域对象完成任务,应用层可以调用其他系统的应用层领域层:包含所有的业务规则与知识基础设施层:上面各层均可调用该层,为其他层提供通用的技术能力,如:业务平台,编程框架,持久化机制,消息机制,第三方库的封装,通用算法,等等...原创 2020-08-12 12:31:53 · 537 阅读 · 0 评论 -
10 领域驱动设计 上下文之间的关系
共享内核当两个边界上下文需要共享一些模型,这个适合时候,我们通常需要分离出这些共享的模型,放到共享内核(一个module),共享内核通常是 核心域 或 通用子领域 ,共享内核由负责这两个上下文的团队负责,测试也是由这两个团队编写建立的共享内核的上下文可以共享模型客户/供应商一个系统服务于另一个系统,那么一个上下文服务于另一个上下文墨守成规新开发的系统需要应用现有系统的部分模型,但应用现有系统的开发团队不会根据新开发系统团队的需求来提供接口,这时候可以选择使用现有的模型进行开发,这相当于上下文B包原创 2020-08-11 14:06:04 · 427 阅读 · 0 评论 -
9 领域驱动设计 边界上下文
边界上下文是一个领域概念,其声明了当前模型的应用范围如:前台客房预订系统(位于客房预订上下文中)与后台客房管理系统(位于客房管理上下文中)不在一个边界上下文内,因为他们的模型不能共享(如:前台客房预订有订单的概念,但后台客房管理并不需要订单的概念),当我们新增一个概念“清洁员”,那么这个概念应该放在哪?明显应该放在后台客房管理系统不同的边界上下文不应该共享代码,除非分离出共享核心如(还是使用上面的示例):我们现在想要vip预订系统,vip预订系统需要使用前台客房预订系统的模型,所以vip预订系统属原创 2020-08-11 14:04:58 · 565 阅读 · 0 评论 -
8 领域驱动设计 柔性设计
哎,不想示例了,凑合着看吧使用柔性设计可以减少我们系统的耦合度释意接口类名要表达出对象对属性方法不要使用缩写尽量表达出接口的用途,而不表名以何种方式无副作用函数返回结果而不产生副作用的操作称为函数let arr = [1, 2, 3, 4]// filter 是无副作用函数let newArr = arr.filter(e=>e > 2);// push 不是无副作用函数arr.push(5);如果一个操作既有读又有写,那么应该重构为两个函数,读写分离注:从上述原创 2020-08-11 14:02:10 · 269 阅读 · 0 评论 -
7 领域驱动设计 不明显概念建模
约束是非常重要的概念,模型中应该表现出来业务规则不适合作为Entity或ValueObject的职责,下面介绍一种模式模式:Specification(规格)1.验证规格类用于测试当前对象是否满足规则,注意依赖关系,是规格依赖于实体2.查询规格类用于筛选...原创 2020-08-11 13:49:41 · 194 阅读 · 0 评论 -
6 领域驱动设计 概念挖掘
当开发人员和领域专家都在使用设计中没有的词汇时,可能已经遗漏了某个对象当你在重构中遇到某几个类具有相似的行为和参数,那么你可能可以提炼一个超类示例如下,你如何挖掘概念// 聚合根class Component { ... public string MenuName { get; set; } public string PageName { get; set; } public string PageIndex { get; set; } public Css原创 2020-08-11 13:43:28 · 219 阅读 · 0 评论 -
5 领域驱动设计 仓库
仓库用于持久化实体(你可以持久化到本地硬盘,或数据库等),在查询时恢复实体只有聚合根才有仓库,聚合根内部通过聚合索引访问通过仓库对聚合进行增删改查仓库不会提交事物,事物提交在应用层如下一个示例:// 页面仓库// PageBase 聚合根// EfRepository 基类包含了对实体的 增删改查 等操作public class PageRepository : EfRepository<PageBase, int>, IPageRepository{ public P原创 2020-08-11 13:04:13 · 1073 阅读 · 0 评论 -
4 领域驱动设计 工厂
工厂工厂可以是工厂类,也可以是工厂方法// 工厂类class ProductFactory{ public Product createProductA(){ .... }}// 工程方法class Product{ public static Product createProductA(){ .... }}工厂负责创建复杂的类或聚合工厂的每个操作是原子的,要么成功,要么失败如果工厂接收一个创建请求但无法完成创建,应该原创 2020-08-11 13:01:42 · 436 阅读 · 0 评论 -
3 领域驱动设计 聚合
一组相关对象的集合,数据修改的单元聚合根访问聚和修改都从聚合根开始,聚合根是一张表,一个聚合只有一个聚合根聚合内部聚合内可以引用其他聚合根,外部对象不能引用聚合内部实体,可以将聚合内部实体引用传给外部,但只能是临时引用,聚合内部实体的声明周期由聚合根决定如图:聚合根是ComponentData(这里有一个疑惑?DefaultComponentData和ContentComponentData到底算不算聚合根)聚合根与服务的依赖关系服务应直接依赖与聚合根,而不要依赖与聚合内部实体// 聚合原创 2020-08-11 12:58:33 · 239 阅读 · 0 评论 -
1 领域驱动设计教程简介
前言该系列教程为依据个人理解,如果有不对的地方(有些地方我也很疑惑,不知道对不对),欢迎指出,我会进行改正前提知识本教程不作为入门教程,在阅读本教程前因该对领域驱动设计有所了解,对 uml 有所了解,对设计和面向对象编程有所了解书籍与框架推荐读者阅读《领域驱动设计》这本书,对于.net [Core] 推荐使用 ABP 框架...原创 2020-08-11 12:11:52 · 262 阅读 · 0 评论 -
2 领域概念
关联模型关联越少越好简化关联1.规定一个遍历方向2.添加限定符(如一个国家有过很多总统,但每个时期只有一个,时期就是限定符)3.消除不必要的关联实体实体具有生命周期,在生命周期内可跟踪简单的讲,如果我们要追踪一个物体,那么他就是一个实体,实体的信息不一定要保存在数据库中,例如:站点图片,我们要时刻掌握站点图片的信息,在以便在业务中对站点图片进行操作,这时站点图片就是实体,而这个实体的标识是完全路径名,图片的信息(如图片的大小)我们可以利用IO函数从图片中获取值对象值对象没有标识,无生命原创 2020-08-11 11:55:57 · 545 阅读 · 0 评论