Golang MDSC 约定

ModelCtrl是必须的,如果Ctrl方法要单元测试或复用则需抽象出Service
有数据库操作可创建DAOModelDAOService使用单元测试,Ctrl使用RESTClient.http文件测试。

分层结构

  • Model (模型)
    • 可以包含少量方法;
    • 不引用外部资源;
    • 功能:
      • 数据传输;
      • 持久化;
      • 字段校验;
      • jsonxml格式定义;
    • 如无必要,转换jsonxml格式时无需改变字段大小写,减少无谓的工作量;
  • DAO(数据操作接口)
    • 读写数据库
    • 可被ctrlservice调用;
    • 除数据库操作对象,不调用其他资源;
  • Service (服务)
    • 提供被多方使用的公共方法;
    • 名称以Service结尾;
    • 会被多个CtrlService调用;
    • 可创建、输入、输出Model
    • 可调用其他ServiceDAO
    • 不可调用Ctrl
    • 主要的单元测试对象,覆盖率要足够高;
    • 提供一个New方法创建服务,方法的参数是需要引用的其他服务;
    • 两个Service避免循环引用,如果无法避免,可赋值引用:
      func NewOneServer() *OneServer{
          return &OneServer{}
      }
      func NewTwoServer(os *OneServer) *TwoServer{
          ts := &TwoService{OS: os}
          os.TS = ts
          return ts
      }
      
  • Ctrl (控制器)
    • 对外提供WEB交互服务;
    • 名称以Ctrl结尾;
    • 包含一个路由方法(Party),定义RESTful调用名称、路径、模式、参数等;
    • Ctrl不能被ModelService调用;
    • Ctrl可以调用其他Ctrl,但只能用于路由分发;
    • 为每个Ctrl都提供同名的http测试文件;
    • 提供一个New方法创建控制器,方法的参数是需要引用的服务;

Ctrl & RESTful

  • Ctrl包含一个路由方法(Party);
  • 路由指定的执行方法使用模式开头(getpostputpatchdelete);
  • 避免多级路径,使用扁平结构,这样更灵活,方便管理和重构:
    • 错误:GET /trades/32/orders/5/items/1
    • 正确: GET /items/1?trade=32&order=5
  • 模式定义:
    • get 查询、统计、列表等,无信息被修改;
    • post 创建、增加,主数据总量增长;
    • put 编辑、修改,主体信息被改变,总量不变但可能会变成另外一个实体;
    • patch 状态变更、执行命令,局部信息修改,主体未大改变被加工微调;
    • delete 删除、作废,失效不再关注;
  • get 无主键是列表,有主键是根据主键查询单条记录
  • get 有路径参数,是根据路径参数统计、分析;
  • patch 主键写在路径上,参数放在params中:
    • PATCH /trades/32/send?express=SF
    • PATCH /trades/32/confirm?mode=phone
  • patch 数据可以是结构化的
    PATCH /trades/32/tags
    content-type: application/json
    
    [1,3]
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容