初识DDD

什么是DDD(领域驱动设计)

一、分层
1.应用层 (控制层)
2.领域层 (服务层)    
3.基础层 (数据层)

二、元素
1.聚合边界 
    业务边界 如订单相关业务为一个边界  
2.聚合根   
    边界内唯一主要实体 负责对外交互 以及操作边界内部对象的方法  类似于微型的网关 一个边界提供一个入口
3.关联     
    1.聚合对象之间的引用 
    2.尽量少关联 解耦
4.实体      
    类似于对象 区别是每个实体有一个唯一标识 也能被持久化到数据库 
5.值对象   
    可变性比较小的实体 如地址 并且没有唯一标识  如果所有属性相同就认为两个值对象相同
举例  一个订单聚合根包含 一个唯一id 多个OrderItem订单项实体  一个address值对象  就表示一个完整的聚合边界
public class Order {
    private Long id;
    private List<OrderItem> items;
    private Address  address;
    // ...
}

6.领域服务 
    类似service服务用于与数据层打交道以及 当单个领域对象处理不了的问题 由领域服务处理 类似面向过程 例如转账流程 下单流程

对比说明,说到领域服务,还需要提一下软件中一般有三种服务:应用层服务、领域服务、基础服务。
应用层服务
    获取输入(如一个XML请求);
    发送消息给领域层服务,要求其实现转帐的业务逻辑;
    领域层服务处理成功,则调用基础层服务发送Email通知;
领域层服务
    获取源帐号和目标帐号,分别通知源帐号和目标帐号进行扣除金额和增加金额的操作;
    提供返回结果给应用层;
基础层服务
    按照应用层的请求,发送Email通知;

所以,从上面的例子中可以清晰的看出,每种服务的职责;

7.工厂(Factory)
    生产复杂的领域对象
8.仓储(Repository)
    保存领域对象 一般是一个聚合根对应一个仓储  例如order 对应 orderRepository
9.工作单元(Unit Of Work)
    事务处理  获取数据库连接 手动提交回滚  和mvc不同的是,DDD是应用层发起工作单元管理事务
    
三、拓展
1.CQRS架构 
    读写架构分离    领域模型 不适合处理复杂的查询 因为领域模型偏向于面向对象  复杂查询额外使用查询引擎 执行sql处理
    这样的思想有很多好处:
    实现命令部分的领域模型不用经常为了领域对象可能会被如何查询而做一些折中处理;
    由于命令和查询是完全分离的,所以这两部分可以用不同的技术架构实现,包括数据库设计都可以分开设计,每一部分可以充分发挥其长处;
    高性能,命令端因为没有返回值,可以像消息队列一样接受命令,放在队列中,慢慢处理;处理完后,可以通过异步的方式通知查询端,这样查询端可以做数据同步的处理;
2.Event Sourcing(事件溯源)相当于记录每一步的动作 
    对于DDD中的聚合,不保存聚合的当前状态,而是保存对象上所发生的每个事件。当要重建一个聚合对象时,
    可以通过回溯这些事件(即让这些事件重新发生)来让对象恢复到某个特定的状态;因为有时一个聚合可能会发生很多事件,所以如果每次要在重建对象时都从头回溯事件,
    会导致性能低下,所以我们会在一定时候为聚合创建一个快照。这样,我们就可以基于某个快照开始创建聚合对象了。
3.DCI架构
    1.DCI是数据Data 场景Context 交互Interactions的简称,DCI是一种特别关注行为的模式(可以对应GoF行为模式)
    2.DCI架构强调,软件应该真实的模拟现实生活中对象的交互方式,代码应该准确朴实的反映用户的心智模型。
        在DCI中有:数据模型、角色模型、以及上下文这三个概念。数据模型表示程序的结构,目前我们所理解的
        DDD中的领域模型可以很好的表示数据模型;角色模型表示数据如何交互,一个角色定义了某个“身份”所具有
        的交互行为;上下文对应业务场景,用于实现业务用例,注意是业务用例而不是系统用例,业务用例只与业务
        相关;软件运行时,根据用户的操作,系统创建相应的场景,并把相关的数据对象作为场景参与者传递给场景,
        然后场景知道该为每个对象赋予什么角色,当对象被赋予某个角色后就真正成为有交互能力的对象,然后与其
        他对象进行交互;这个过程与现实生活中我们所理解的对象是一致的;
    3.DCI则通用引入角色,赋予角色以交互能力,然后让角色之间进行交互,从而可以让我们看到对象与对象之间交互的过程
    4.DDD中的领域服务在协调领域对象做事情时,领域对象往往是处于一个被动的地位,
        领域服务通知每个对象要求其做自己能做的事情,这样就行了。这个过程中我们
        似乎看不到对象之间交互的意思,因为整个过程都是由领域服务以面向过程的思维去实现了
参考文章
https://zhuanlan.zhihu.com/p/361427612
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值