`
talentluke
  • 浏览: 604460 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DDD DCI和领域事件

 
阅读更多

摘自http://www.jdon.com/jdonframework/dci.html

 

DDD是领域驱动设计(Domain-Driven Design )的简称,DDD是一种分析设计建模方法,它倡导统一语言,提出了实体和值对象 以及聚合根等概念,借助DDD我们能够在结构理清需求中领域模型。DDD专题。

     DCI: Data数据模型, Context上下文或场景, Interactions交互行为是一种新的编程范式,由MVC发明人Trygve Reenskaug提出。 DCI架构是什么? 

     DCI的关键是:
     1. 要让核心模型非常瘦.
     2. 逻辑或行为应该放在角色这个类中

     Event Sourcing是由Martin Fowler提出,是将业务领域精髓(尤其是最复杂的)与技术平台的复杂性实现脱钩的天作之合。为什么要用Event Sourcing? Domain Events – 救世主

    下面我们将演示如何将上述三者在实践中结合在一起?

    以机器人Robot这个需求为案例,下图是Robot描述,我们根据这种图通过DDD建模。

robot

    从上面这张图中,我们根据DDD的实体聚合根等定义,得出如下类图:

robot

    可见,Robot作为一个聚合集合的根实体,它有四个重要部分组成,这些组成部分与Robot形成一种高凝聚的组合关系。缺一不可。

    有了这样的结构关系,我们还将细化方法行为,根据  对象的责任与职责 ,也就是职责驱动开发方法论,它提出一种角色职责的模型:roles-and-responsibilities ,见Object Design: Roles, Responsibilities, and Collaborations) ,什么是职责呢?职责就是那些knowing what; doing what; deciding what.

    那么Robot如果作为一个智能机器人,它应该有哪些职责呢?
    Robot的职责功能是能听,能看或能感觉,听 看 感觉这些都是其作为一个智能机器人角色的职责。

    那么,下一步关键是,如何实现这些职责呢?是否是将这些职责设计作为Robot实体类的方法呢?如下:

bad class

    这样设计以后,可能会导致Robot实体类非常臃肿,是一个庞大的对象,这有违背DCI要旨。

    DCI认为要保持模型的精简,听 看 感觉这些行为是Robot作为一个智能机器人,不是普通机器人,这样一个特殊角色具备的职责,应此,应该将这些行为放入一个叫智能机器人的角色中。当在运 行时需要的场景context时,我们将这个角色中的职责行为注入到精简的数据模型中,如下图:

DCI

    这样的例子很多,一个人在家是父亲,在单位是经理,父亲和经理都是角色,是不是要将这些角色行为比如签字 烧菜这些和具体业务场景有关的职责放入“人”这个类中呢?显然不是。

    又比如银行账户Account有三种角色:两个是设计角色 BankAccount银行账户 和FinancialAsset理财账户, 另外一个角色是技术角色,它又是EJB的实体Bean专门用来实现持久化保存。

account

    那么如何将上面DCI设计或职责驱动落实为代码呢?特别是Robot实体类和角色智能机器人的行为如何在运行时场景结合呢?这非常类似桥模式:

public String hello(String id) {
    Robot robot = robotRepository.find(id);
    //将角色智能机器人IntelligentRole的行为注入到Robot数据对象中
    IntelligentRole intelligentRobot = (IntelligentRole) roleAssigner.assign(robot, new IntelligentRobot());
    //得到一个混和robot将具有听 看 感觉等能力行为
    return "Hello, " + intelligentRobot.hear();
 }

    类似Account的实体持久化角色,, Robot也有一个保存自己到数据库的技术职责,Robot保存自己应该是首先由自己发出这样意愿,而不是被保存,是主动保存,其次保存数据库这个动作耗 时,影响性能,因此,我们使用领域事件Domain Events来间接实现。

    一个PublisherRole是保存事件发送者 Robot可以扮演这样一个角色发出保存事件。:

@Introduce("message")
public class PublisherRoleImp implements PublisherRole {

 @Send("saveme")
  public DomainMessage remember(Robot robot) {
     return new DomainMessage(robot);
   }
}

    保存事件的接受方就是DDD中定义的仓储Respository:

@Component
@Introduce("modelCache")
public class RobotRepositoryInMEM implements RobotRepository {
    .....


   //保存事件的订阅者 真正实现数据库保存
  @OnEvent("saveme")  
   public void save(Robot robot) {
          memDB.put(robot.getId(), robot);
   }

  .....
}

    那么 Robot在什么时候扮演事件发送者发出保存自己的命令呢?可以在任何时候,下面是一个context:

public void save(Robot robot) {
   PublisherRole publisher = (PublisherRole) roleAssigner.assign(robot, new PublisherRoleImp());
   publisher.remember(robot);
 }

    至此,我们通过机器人Robot案例展示了DDD DCI和事件模型等分析设计实现的过程,当然复杂项目将比这个过程更加复杂,需要敏捷迭代,精炼出符合客观规律的核心模型。

    以上Robot实现源代码下载:bot.zip

分享到:
评论

相关推荐

    DDD领域驱动设计 DCI架构

    领域模型是这个统一语言的基础,它应该清晰地反映出业务实体、值对象、聚合、领域事件等关键概念,并通过这些概念来定义业务规则和流程。 在软件架构中,领域模型位于中心位置,它是业务逻辑的载体,与技术实现分离...

    DDD领域驱动设计基本理论知识总结.docx

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,旨在通过深入理解和建模复杂的业务领域,来创建高质量、易于维护的软件系统。DDD的核心在于领域模型,它是对业务领域的抽象表示,包含了业务规则...

    GD32F407 DCI LWIP

    在GD32F407中,DCI可以支持高速、低延迟的图像捕获和传输,为实现嵌入式视觉应用提供了基础。例如,可以构建一个基于GD32F407的嵌入式系统,通过DCI接口连接摄像头,再结合LWIP将图像数据上传到网络服务器,实现远程...

    MPLS L3 VRF DCI配置.rar

    MPLS L3vrf DCI配置 https://editor.csdn.net/md/?articleId=120409937 DCI互联 Layer 3 VRF-MPLS (EVE vqfx实验)全部配置

    中国电信DCI组网和策略规范

    本文档基于中国电信ChinaNet网的网络现状,并根据中国电信宽带互联网业务承载的需求,对ChinaNet网组网结构、路由策略、链路组织、网络安全、资源分配等内容进行了规范。

    GY-906 MLX90614ESF BAA BCC DCI IR红外测温传感器模块温度采集资料.zip

    GY-906 MLX90614ESF BAA BCC DCI IR红外测温传感器模块是一款广泛应用在温度监测领域的高科技设备。这款模块基于Melexis公司的MLX90614ESF芯片,它是一款高精度、非接触式的红外热电堆传感器,能够测量环境及物体...

    通信行业周报:中国电信采购DCI波分设备,开放光网络拉开帷幕.zip

    开放光网络(Open Optical Networking)是近年来通信领域的热点话题,它强调网络设备的模块化、标准化和开源化。与传统的封闭式网络设备相比,开放光网络允许运营商选择来自不同供应商的组件,降低了对单一供应商的...

    DM8 - DCI Program.pdf

    DM8 DCI(Data Communication Interface)是达梦数据库提供的一种编程接口,用于在应用程序和DM数据库之间建立通信,实现数据的存取和处理。DCI接口基于OCI(Oracle Call Interface),提供了与Oracle数据库兼容的...

    6645G下行DCI设计和流程 pdf文档整理.zip

    本资料整理自一个PDF文档,旨在深入解析6645G网络中的DCI结构、编码和解码过程以及其在实际通信系统中的应用。 首先,我们要理解DCI的含义。在5G系统中,DCI是基站(gNB)向用户设备(UE)发送的控制信息,用于指示...

    基于UltraScale+FPGA可编程逻辑DCI互连盒设计

    在数据中心领域,云计算的兴起和机器间的通信导致数据量呈爆炸性增长。这些海量数据带来了对数据中心内部及数据中心间高速、安全且可升级的数据传输需求。数据中心互连(DCI)正是为了解决这一需求而产生的技术,其...

    DCI型细水口模架.zip

    DCI型细水口模架是模具设计中的一个重要概念,尤其在注塑模具领域中广泛应用。这种模架设计主要用于实现高效的塑料制品生产,确保产品精度和质量。在深入理解DCI型细水口模架之前,我们需要先了解模架的基本结构和...

    5G(NR) 网络中的DCI介绍.docx

    4G、5G网络优化

    DCI format - DCI.zip

    包含DCI0-0、DCI0-1、DCI1-0、DCI1-1的解码 输入字节流,解出对应字段的内容 如0-0中。 Nrb_dl_bwp 48 payload bitstring 11010100101110101111111 频域资源分配 11 11010100101 时域资源分配" 4 1101 VRB-to-PRB...

    dci.rar_surveillance

    本文将围绕“dci.rar”这一压缩包文件中的“医疗监控系统”进行深入探讨,旨在揭示其背后的科技内涵和应用场景。 医疗监控系统是现代医疗保健体系中的重要组成部分,它通过集成各种传感器、设备和软件,实现对患者...

Global site tag (gtag.js) - Google Analytics