COLA

架构图

四层结构

cola-arch.jpg

  1. 适配层(Adapter Layer):负责对前端展示(web,wireless,wap)的路由和适配,对于传统B/S系统而言,adapter就相当于MVC中的controller;

  2. 应用层(Application Layer):主要负责获取输入,组装上下文,参数校验,调用领域层做业务处理,如果需要的话,发送消息通知等。层次是开放的,应用层也可以绕过领域层,直接访问基础实施层;

  3. 领域层(Domain Layer):主要是封装了核心业务逻辑,并通过领域服务(Domain Service)和领域对象(Domain Entity)的方法对App层提供业务实体和业务逻辑计算。领域是应用的核心,不依赖任何其他层次;

  4. 基础实施层(Infrastructure Layer):主要负责技术细节问题的处理,比如数据库的CRUD、搜索引擎、文件系统、分布式服务的RPC等。此外,领域防腐的重任也落在这里,外部依赖需要通过gateway的转义处理,才能被上面的App层和Domain层使用。

组件说明

  1. gateway是为了防腐
  2. Infra层起数据屏蔽作用,如果提供的接口不变,数据层的改动都可以直接在Infra里面完成
  3. 第三方服务的调用在Infra层
  4. 为了易于理解可以把Adapter改为Controller

调用关系

cola-invoke-chain.jpg

  1. APP —> Infra, 为了可以直接CRUD,同时也是为什么Infra 可以直接依赖Client包
  2. APP —> gateway, 为了解耦/防腐/数据聚合
  3. APP —> domain service —> gateway —> 存储/缓存/外部服务, 为了实现复杂领域业务
    灵活使用,覆盖不同的场景

调用过程及对象使用

  1. Client
    定义如下对象
    • VO(View Object),Adapter层使用
    • Command,APP层使用,包含Qry、Add/Update/Delete
    • DomainEvent,Infra层发布领域事件使用
    • ServiceI,APP层实现该服务对外提供应用API
  2. Adapter层
    接收Command或者参数列表传递给ServiceI
    返回Response+VO给前端
  3. APP层
    ServiceImpl接收Command
    • 直接/间接传给Mapper
    • 转换成Entity,传给gateway或者domainservice
      返回Response+VO给Adapter层
  4. Domain — 不依赖其他任何层
    定义领域对象Entity
    Entity作为gateway的参数或返回
    Entity作为domain service的参数或返回
  5. Infa
    1. 调用数据库直接用Mybatis的Mapper,返回DO
    2. 调用第三方服务封装DO和Mapper,返回DO
    3. gatewayImpl通过mapper聚合来提供上层数据接口,返回Entity
    4. DomainEvent的发布