领域驱动设计

1.分层结构

  Interfaces:接口层
    该层包含与其他系统交互的所有内容,例如web服务,rmi服务。
    对传入的数据进行解释、验证和转换
    对传出的数据就行转换,序列化等
  Application:应用层
    应用层负责驱动应用程序的工作流程,匹配用例
    其操作是独立于接口的,可以是同步调用,或者消息驱动
    适合做跨越事物、高级别的日志记录
    应用层很薄,只是用来协调领域层对象以执行实际工作
  Domain:领域层
    领域是软件的核心(业务逻辑的核心),主要是业务逻辑的封装
    每个聚合有一个包(聚合可以理解为某一个独立业务,具体依赖建模方式)
    每个聚合下面包含实体类,值对象,域事件,存储库接口,工厂
  Infrastructure:基础设施层
    上面上个是垂直层,基础设施同时为上面三层提供服务,促进层之间的沟通
    包含独立于应用程序的所有内容:外部库,数据局引擎,数据传递后端。举例:
    不依赖与具体的持久化方案与实现,不依赖于消息队列的具体选型
    这里提供实现,上面其它层定义接口
    简言之:对于外部的依赖在这里封装,其它层无需感知具体选型与实现
    去除(mock)基础设施层的代码,应该依然可以进行单元测试,而且业务逻辑整体可以跑通

2.基本概念

  entity:实体
    有明确的身份(id),有状态转换周期(数据改变),一般需要持久化
  value object:值对象
    没有明确的身份(id),没有状态转换,不可变对象
  domain event:域事件
    有身份(id),没有生命周期(数据不可变),是实体和值对象的混合体
  aggregates:聚合
    聚合一般使用一个聚合根对象实现
    聚合根通过设置实体之间的关系规则来帮助解耦大型结构
    聚合根也可以具有不适合单个类的属性,方法和变量
    一般一个或多个模型中需要提炼一个聚合根,这样外界只需和聚合根打交道
  Repositories:存储库(可以理解为一个dao层接口)
    存储库工作在聚合跟之上,每个聚合根对应一个存储库
    存储库用于保存聚合根对象(一般是实体类)
    存储库接口属于领域层,实现属于基础设施层
  Domain Services:领域服务
    领域服务以域类型的形式表示
    领域服务的方法参数和返回值是领域模型对象
    领域服务的接口定义属于领域层,实现属于基础设施层或者领域层(根据相关度而言)
  Application Services:应用服务
    对领域层的工作流控制,简言之,就是根据业务拼装参数,组合调用多个底层服务。

3.包结构

Interfaces
  Facade
  DTO
  Assembler
Application
  Service
Domain
  module
  service
  shared
Infrastructure

4.图解

 

备注

官方示例代码:

  https://github.com/citerus/dddsample-core

官方概念解读:

  http://dddsample.sourceforge.net/characterization.html

原文地址:https://www.cnblogs.com/gc65/p/11331925.html