COLA-framework的module如下:
cola-common
cola-core
cola-test
用maven-archetype生成的代码例子的module情况:
demo-app
demo-client
demo-controller
demo-domain
demo-infrastructure
start
按照数据流的顺序,分别介绍各moduel的作用,以及代码放置的地方:
容易理解,放置所有的`@RestController`;
一般的分包如下:
com.alibaba.xxx.controller
主要负责获取输入,组装context,做输入校验,发送消息给领域层做业务处理,监听确认消息,如果需要的话使用MetaQ进行消息通知;
一般包含以下这些包:
com.alibaba.sample.command // CmdExe执行器
com.alibaba.sample.command.query // QryExe执行器
com.alibaba.sample.command.extensionpoint // 扩展点(接口)
com.alibaba.sample.command.extension // 扩展(实现)
com.alibaba.sample.command.interceptor // 各种拦截器@XxxInterceptor
com.alibaba.sample.convertor // ConvertorI实现
com.alibaba.sample.event.handler // 事件处理器@EventHandler
com.alibaba.sample.repository // repository,调用db tunnel
com.alibaba.sample.service // Service的实现
com.alibaba.sample.validator // ValidatorI实现
com.alibaba.sample.assembler // 参数装配器
CmdExe和QryExe依赖Repository;
Repository依赖Tunnel获取Domain数据,依赖Converter来做DO/CO等的转换,依赖DomainEventPublisher来发布事件;
xxx-client
xxx-client应该不是功能独立的层,而是作为COLA-framework中`cola-common`模块的第二方库,什么意思?查看cola-common源码和xxx-client的代码,它们的类型应该是平行对应的。即`xxx-client`包含的代码应该是常见的`Service`的接口Facade,上下文信息`Context`以及dto(`ClientObject`、`DomainObject`、`DomainEvent`、`Cmd`和`Qry`)等。
`xxx-client`的分包情况一般是:
com.alibaba.sample.api // Service接口
com.alibaba.sample.context // 一般在拦截器中,请求处理前初始化,上下文在一个请求中会被各层用到
com.alibaba.sample.dto // Cmd和Qry,一个Cmd就是客户的一个请求;Qry是一种特殊的Cmd,它直接操作Tunnel返回数据
com.alibaba.sample.dto.clientobject // 用于调用者(controller、RPC、MTop等)与APP之间的数据转换
com.alibaba.sample.dto.domainevent // 领域事件
主要是通过领域服务(Domain Service),领域对象(Domain Object)的交互,对上层提供业务逻辑的处理,然后调用下层Repository做持久化处理;
一般包命名如下:
com.alibaba.sample.domain.xxxx // xxxx表示具体的领域对象名称
com.alibaba.sample.domain.xxxx.entity
com.alibaba.sample.domain.xxxx.factory
除了领域对象(属性和行为)外,还可以包含相关的枚举类、DomainFactory等;
主要包含Repository,Config,Common和message,Repository负责数据的CRUD操作,通过Tunnel的抽象概念来屏蔽具体的数据来源,来源可以是MySQL,NoSql,Search,甚至是HSF等;Config负责应用的配置;Common是一写工具类;负责message通信的也应该放在这一层。
可以包含如下一些包:
com.alibaba.sample.common // 如一些BizCode业务线代码
com.alibaba.sample.common.exception // 系统异常类,ErrorCodeI的实现
com.alibaba.sample.common.util // util
com.alibaba.sample.config // ColaConfig等
com.alibaba.craftsman.tunnel.database // 数据库tunnel,mybatis Mapper等
com.alibaba.sample.tunnel.database.dataobject // 数据库tunnel的DO
com.alibaba.craftsman.tunnel.rpc // rpc tunnel
SpringBoot的启动类,入口,读取ColaConfig启动COLA。
总结:各种代码类应该放到合适的位置,使其自明,符合他们所在的分层,各司其职,不能混淆。