当前位置: 首页 > news >正文

【go】依赖倒置demo

文章目录

  • 前言
    • 1 项目目录结构:
    • 2 初始化函数
    • 3 router
    • 4 api
    • 5 service
    • 6 dao
    • 7 Reference

前言

为降低代码耦合性,采用依赖注入的设计模式。原始请求路径:router -> api -> service -> dao。请求的为实际方法,具有层层依赖的关系。现将方法抽象为接口,即a依赖b,但a不创建(或销毁)b,仅使用b,b的创建(或销毁)交给容器。

1 项目目录结构:

├─ddd
│  ├─router.go
│  │ 
│  ├─api
│  │  └─api_abstract.go   // 抽象接口
│  │  └─api_dog.go   // dog实现接口
│  │ 
│  ├─service
│  │  └─srv_abstract.go 
│  │  └─srv_dog.go  
│  │  
│  ├─dao
│  │  └─dao_abstract.go  
│  │  └─dao_dog.go  
│  │  
│  ├─model
│  │  ├─dto
│  │  └─schema

2 初始化函数

// 依赖注入
func InitDog() *DogApiImpl  {d := dao.NewDogDaoImpl(global.DB)s := service.NewDogSrvImpl(d)return api.NewDogApiImpl(s)
}

3 router

func Router() *gin.Engine {dog := init.InitDog()r.GET("/info", dog.Info)...
}

4 api

api_abstract.go中为抽象接口:

type DogAPIIface interface {Create(ctx *gin.Context)Update(ctx *gin.Context)Info(ctx *gin.Context)List(ctx *gin.Context)
}

api_dog.go中为api的实现方法:

type DogApiImpl struct {srv service.DogSrvIface
}var _ DogAPIIface = (*DogApiImpl)(nil)func NewDogApiImpl(srv service.DogSrvIface) *DogApiImpl {return &DogApiImpl{srv: srv,}
}func (da *DogApiImpl) Info(ctx *gin.Context) {var req dto.DogInfoReqif err := ctx.ShouldBindUri(&req); err != nil {return}res, err := da.srv.Info(ctx, req.ID)if err != nil {return}helper.Response.ResponseSuccessWithData(ctx, consts.Success, res)
}// 其他待实现方法
func (da *DogApiImpl) Create(ctx *gin.Context) {
}...

5 service

srv_abstract.go中为抽象接口:

type DogSrvIface interface {Create(ctx *gin.Context, req *dto.DogCreateReq) errorUpdate(ctx *gin.Context, req *dto.DogUpdateReq) errorInfo(ctx *gin.Context, req *dto.DogInfoReq) (*dto.DogInfoRes, error)List(ctx *gin.Context, req *dto.DogListReq) ([]*dto.DogInfoRes, int, error)
}

srv_dog.go中为service的实现方法:

type DogSrvImpl struct {dao dao.DogDaoIface
}var _ DogSrvIface = (*DogSrvImpl)(nil)func NewDogSrvImpl(dao dao.DogDaoIface) *DogSrvImpl {return &DogSrvImpl{dao: dao,}
}func (ds *DogSrvImpl) Info(ctx *gin.Context, req *dto.DogInfoReq) (*dto.DogInfoRes, error) {var data dto.DogInfoReq// 具体业务逻辑dog, err := ds.dao.FindByID(ctx, id)if err != nil {return nil, err}return &dog, err
}
...

6 dao

dao_abstract.go中为抽象接口:

type DogDaoIface interface {Create(ctx *gin.Context, req *dto.DogCreateReq) errorUpdate(ctx *gin.Context, req *dto.DogUpdateReq) errorInfo(ctx *gin.Context, req *dto.DogInfoReq) (*dto.DogInfoRes, error)List(ctx *gin.Context, req *dto.DogListReq) ([]*dto.DogInfoRes, int, error)
}

dao_dog.go中为dao的实现方法:

type DogDaoImpl struct {db *gorm.DB
}var _ dao.DogDaoIface = (*DogDaoImpl )(nil)func NewDogDaoImpl(db gorm.DB) *DogDaoImpl{return &DogDaoImpl{db: &db,}
}func (ds *DogSrvImpl) Info(ctx *gin.Context, req *dto.DogInfoReq) (*dto.DogInfoRes, error) {// 具体业务逻辑return nil, nil
}
...

7 Reference

https://blog.hackerpie.com/posts/testing/golang-write-testable-codes/
https://juejin.cn/post/7146852457774055437

相关文章:

  • Kylin安装学习教程
  • 机器学习:BootStrapping(Python)
  • 【大数据】Flink 测试利器:DataGen
  • element-ui 打包流程源码解析(下)
  • 2018年认证杯SPSSPRO杯数学建模B题(第二阶段)动态模糊图像全过程文档及程序
  • 怿星科技测试实验室获CNAS实验室认可,汽车以太网检测能力达国际标准
  • 腾讯云MPS为出海媒体企业助力
  • 《TrollStore巨魔商店》TrollStore2安装使用教程支持IOS14.0-16.6.1
  • Linux centos中find命令的多种用途:按照具体应用来详细说明find的用法举例
  • Conmi的正确答案——使用eclipse进行ESP32C3的debug
  • C#学习笔记3-函数与单元测试
  • 查询数据库表字段具有某些特征的表
  • 【工作周志】240108-240114
  • 系统配置dns主从服务器
  • 使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:第十九章到第二十一章
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Android单元测试 - 几个重要问题
  • Angular 2 DI - IoC DI - 1
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • egg(89)--egg之redis的发布和订阅
  • exports和module.exports
  • Gradle 5.0 正式版发布
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IDEA 插件开发入门教程
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • quasar-framework cnodejs社区
  • SQLServer之创建显式事务
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue--数据传输
  • 分享几个不错的工具
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊聊flink的BlobWriter
  • 如何使用 JavaScript 解析 URL
  • 入门级的git使用指北
  • 用Python写一份独特的元宵节祝福
  • 2017年360最后一道编程题
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Maven错误Error executing Maven
  • #ifdef 的技巧用法
  • $GOPATH/go.mod exists but should not goland
  • (TOJ2804)Even? Odd?
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (算法)求1到1亿间的质数或素数
  • (未解决)macOS matplotlib 中文是方框
  • (原)本想说脏话,奈何已放下
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . Flume面试题
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net CF下精确的计时器
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • // an array of int