COLA开发流程总结

COLA发起者的博客
COLA是一套用于帮助你实践DDD落地的项目架构,在开发COLA之前,我们先再熟悉一下基于COLA创建的项目的结构:

demo-client:

  • api:存放的是对外暴露的接口
  • dto.domainmodel:用来做数据传输的轻量级领域对象。
  • to.domainevent: 用来做数据传输的领域事件。

demo-app:

  • service:接口实现的facade,没有业务逻辑,可以包含对不同终端的adapter。
  • eventhandler:处理领域事件,包括本域的和外域的。
  • executor:用来处理命令(Command)和查询(Query),对复杂业务,可以包含Phase和Step。
  • interceptor: COLA提供的对所有请求的AOP处理机制。
  • validator:用来对传入的命令进行参数校验。

demo-domain:

  • domain:领域实体。
  • domainservice: 领域服务,用来提供更粗粒度的领域能力。
  • gateway:对外依赖的网关接口,包括存储、RPC、Search等,可以认为是对infrastructure的依赖反转。

demo-infrastructure:

  • config:配置信息相关
  • message:消息处理相关。
  • repository:存储相关,是gateway的特化,主要用来做本域的数据CRUD操作。
  • gateway:对外依赖的网关接口(demo-domain里的gateway)的实现。

除此之外,我们还要熟悉一下COLA中关于命名的规范:

在COLA架构中,我们也能找到以前熟悉的VO,DTO等对象,只不过在COLA中他们的后缀名变了:

  • VO->CO,COLA中CO对象用于展示给前端。
  • DTO->Cmd,COLA中Cmd对象用于前端和后端的数据交互。
  • Entiry->DO,数据持久化对象。

此外,对于领域对象domain,比如UserDomain,我们在COLA中称之为UserE。

如何基于COLA架构实现一个CRUD

在COLA中,比如我们想创建一个User,一套完整的调用链大概如下图所示:

以上是一个经过简化版的调用链,实际的调用链还要更复杂,调用过程中可能还包含了多个不同的扩展点(Extension)

查询

假设我们存在一个名叫组织的实体Organization,我们想实现一个根据主键查询的功能,按照COLA的规范,我们应该现在client中创建对应的接口,比如是OrganizationResource

client:

public interface OrganizationResource {/*** 根据id查找* @param id* @return*/@GetMapping(value = "/org/{id}")DataResponse<OrganizationCO> get(@PathVariable(value = "id")String id);
}

application:

@RestController
public class OrganizationController implements OrganizationResource {/*** 根据id查找* @param id* @return*/@Overridepublic DataResponse<OrganizationCO> get(String id) {// 不再使用传统的service做业务查询,将查询的逻辑封装到了对应的领域对象中OrganizationE org = OrganizationE.of().id(id);return org != null ? DataResponse.of(org.convertToClient()): DataResponse.buildFailure(BasicCode.DB_QUERY_NO_RESULT);}
}

domain:

public class OrganizationE {public static OrganizationE of() {return new OrganizationE();}public OrganizationE id(String id) {return getOrganizationGateway().getById(id);}/*** 从对应的gateway中获取实现**/private OrganizationGateway getOrganizationGateway() {if(this.organizationGateway == null) {this.organizationGateway = SpringContextUtil.getBean(OrganizationGateway.class);}return this.organizationGateway;}
}

repostitory:

@Component
public class OrganizationRepository extends RepositorySupport<OrganizationMapper, OrganizationDO> implements OrganizationGateway {public OrganizationE getById(String id) {OrganizationDO dataObject = super.getById(id);return BeanMapper.INSTANCE.copy(dataObject, OrganizationE.class);}
}
新增

client:

创建对应的command

注意:command类必须继承cola提供的Command,否则CommandBus无法发送这些消息给对应的Service处理

@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class OrganizationCreateCmd extends Command {/*** 名称*/@NotBlankprivate String name;/*** 编号,如果没指定,会根据不同的名称生成不同的编号,比如liSi会生成1001,zhangSan会生成2001*/private String code;
}

application:

@RestController
public class OrganizationController implements OrganizationResource {@Autowiredprivate OrganizationService orgService;/*** 自定义创建cust1* @return*/@PostMapping(value = "/org/cust1/create")Response createCust1(@RequestBody OrganizationCreateCmd cmd) {cmd.setBizScenario(BizScenario.valueOf(BizScenarioConstant.BIZ_ID.CUST1));return orgService.create(cmd);}/*** 自定义创建cust2* @return*/@PostMapping(value = "/org/cust2/create")Response createCust2(@RequestBody OrganizationCreateCmd cmd) {cmd.setBizScenario(BizScenario.valueOf(BizScenarioConstant.BIZ_ID.CUST2));return orgService.create(cmd);}
}

service

@Service
public class OrganizationService {// 注入COLA提供的command bus@Autowiredprivate CommandBusI cmdBus;/*** 创建组织* 有两个不同的扩展实现,分别会创建编号为1001和2001的组织信息* @param cmd* @return*/public Response create(OrganizationCreateCmd cmd) {return cmdBus.send(cmd);}
}

extension(扩展点)

public interface OrganizationCreateExtPt extends ExtensionPointI {/*** 组织创建的扩展点* @param cmd* @return*/OrganizationE extension(OrganizationCreateCmd cmd);
}

扩展点实现

@Extension(bizId = BizScenarioConstant.BIZ_ID.CUST1)
public class Cust1OrganizationCreateExt implements OrganizationCreateExtPt {/*** 组织创建的扩展点,根据不同的请求赋予不同的编号* @param cmd* @return*/@Overridepublic OrganizationE extension(OrganizationCreateCmd cmd) {// 如果是cust1 赋予1001return OrganizationE.of(cmd).setCode("1001");}
}
@Extension(bizId = BizScenarioConstant.BIZ_ID.CUST2)
public class Cust2OrganizationCreateExt implements OrganizationCreateExtPt {/*** 组织创建的扩展点,根据不同的请求赋予不同的编号* @param cmd* @return*/@Overridepublic OrganizationE extension(OrganizationCreateCmd cmd) {// 如果是cust2 赋予2001return OrganizationE.of(cmd).setCode("2001");}
}

扩展点执行器

@Command
public class OrganizationCreateCmdExe implements CommandExecutorI<Response, OrganizationCreateCmd> {/*** 参数校验器*/@Autowiredprivate OrganizationCreateValidator validator;/*** 扩展执行器*/@Autowiredprivate ExtensionExecutor executor;@Overridepublic Response execute(OrganizationCreateCmd cmd) {// 执行校验扩展executor.executeVoid(OrganizationCreateValidatorExtPt.class,cmd.getBizScenario(), exe-> exe.validate(cmd));// 执行扩展逻辑OrganizationE org = executor.execute(OrganizationCreateExtPt.class,cmd.getBizScenario(), exe -> exe.extension(cmd));// 调用领域对象的create方法org.create();return Response.buildSuccess();}
}

domain

public class OrganizationE {public OrganizationE create() {if(!getOrganizationGateway().create(this)) {throw new DBSaveFailedException();}return this;}
}

repository

@Component
public class OrganizationRepository extends RepositorySupport<OrganizationMapper, OrganizationDO> implements OrganizationGateway {@Transactionalpublic boolean create(OrganizationE organization) {OrganizationDO dataObject = BeanMapper.INSTANCE.copy(organization, OrganizationDO.class);return super.save(dataObject);}
}

COLA开发流程总结相关推荐

  1. 简述Web程序开发流程

    总体开发流程 分析需求, 列出功能清单或写需求说明书. 设计程序功能, 写功能规格书和技术规格书. 进入开发与测试的迭代. 调试和性能等专项测试. 部署上线 运维 前端开发流程 根据功能规格绘制页面草 ...

  2. 移动端开发者眼中的前端开发流程变迁与前后端分离

    写在最开始 这是一篇面向移动端开发者的科普性文章,从前端开发的最初流程开始,结合示范代码,讨论开发流程的演变过程,希望能覆盖一部分前端开发技术栈,从而对前端开发的相关概念形成初步的认识. 本文会提供一 ...

  3. node.js的开发流程_Node.js子流程:您需要了解的一切

    node.js的开发流程 by Samer Buna 通过Samer Buna Node.js子流程:您需要了解的一切 (Node.js Child Processes: Everything you ...

  4. 软件开发流程包含哪些内容

    2019独角兽企业重金招聘Python工程师标准>>> 能否开发出一个好的软件,关键是看软件开发前期所做的工作,重点是这个软件有没有一个好的 软件开发流程,因为一个好的软件开发流程关 ...

  5. TCP 网络应用程序开发流程

    TCP 网络应用程序开发流程 1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发 TCP 服务端程序开发 说明: 客户端程序是指运行在用户设备上的程序 , ...

  6. web开发流程 - 网上商城示例

    一.需求确定 1:通过各种手段确定系统的功能与性能    1)功能:注册.浏览.搜索...    2)性能:可同时支持n个并发访问,并且响应时间不低于m毫秒...    3)手段:头脑风暴(brain ...

  7. Leangoo阶段式硬件产品开发流程

    一.概述 本场景描述的是基于阶段式硬件研发流程以及在Leangoo中如何实现. 二.硬件产品开发流程 下图所示的是一个硬件产品开发大体上所需要经历的全部流程: 1)立项 在立项之前首先需要确定产品定位 ...

  8. 究竟什么样的开发流程是规范的?

    概述 有读者反馈,读了文章 一线技术管理者究竟在管什么事?收获满满,但还有点不过瘾,还想了解更细的东西... 这篇文章分享开发流程规范,目的是提高产品质量,优化开发流程,供大家参考. 规范是死的,人是 ...

  9. 敏捷开发流程的8个步骤

    一.敏捷开发流程的8个步骤包括: 1.目标制定,目标对齐:通过市场调研.业务思路.风险评估制定公司规划和目标,根据这一目标产生所有部门的目标并实现对齐: 2.产品规划:产品研发部门根据目标制定产品关键 ...

最新文章

  1. 孟晚舟升任华为轮值董事长,任正非曾表态:她无技术背景,不会成为接班人...
  2. 编码原则:不变量/前置条件/后置条件
  3. java 管理对象是什么_Java工程师(16)对象的管理
  4. Quartz.net基于数据库的任务调度管理(Only.Jobs)
  5. 建立项目接口文档_分享:一步一个脚印,vue入门之使用mockjs搭建vue项目测试服务器...
  6. (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节2:I/O控制器
  7. oracle time model,通过案例学调优之--OracleTimeModel(时间模型)
  8. SQL语言之关系运算与多表操作(五)
  9. centos下安装JAVA开发工具(1)------JDK
  10. 利用java多线程技术和图像显示技术来完成动画设计。
  11. python 计算相关系数和决定系数
  12. 【编译原理 思维导图】 陈火旺第三版 前七章
  13. 魔改010Editor Template 识别伪加密
  14. 电脑网页如何截取全图(长图)
  15. python获取验证码失败_python 爬虫:验证码一直错误
  16. 面向对象:只愿得一人心,白首不分离
  17. 使用 Metasploit 渗透局域网 Windows 设备
  18. 测试用例颗粒度实例列举
  19. 微信小程序抽奖 简单功能实现
  20. 2020诺贝尔文学奖得主,死亡的诗歌

热门文章

  1. 海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能
  2. python 儿童 游戏_少儿编程分享:手把手教你用Python编写战斗机游戏(完)
  3. 打包html5调用手机震动,javascript实现手机震动API代码
  4. 有关Amazon站内信邮件类别处理
  5. PC端微信多开bat命令
  6. 皕杰报表在chrome中emitter=print无效问题的解决
  7. windows删除大量文件的优秀方式
  8. C#中,System.ComponentModel.Container详解
  9. 汇编语言实现简单的人机问答
  10. 中国医师节丨华为IdeaHub用远程诊疗护佑人民健康,为医生减负