【go】依赖倒置demo

2024-01-19 22:20
文章标签 go 依赖 倒置 demo

本文主要是介绍【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

这篇关于【go】依赖倒置demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623881

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和