Go新项目-Gin中wire的依赖注入方式实战(6)

这篇具有很好参考价值的文章主要介绍了Go新项目-Gin中wire的依赖注入方式实战(6)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go新项目-Gin中wire的依赖注入方式实战(6),Go,golang,gin,开发语言

选型Go项目过程中,针对依赖注入方式的分析和使用

参考资料

  • https://go.dev/blog/wire
  • https://medium.com/@dche423/master-wire-cn-d57de86caa1b
  • https://toutiao.io/posts/et0t2lk/preview
  • https://imlht.com/archives/223/
  • https://lailin.xyz/post/go-training-week4-wire.html
  • https://luenci.me/2022/01/08/%E8%81%8A%E8%81%8AWire%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5/
  • http://c.biancheng.net/view/78.html
  • https://zhuanlan.zhihu.com/p/338926709
  • https://github.com/DuanJiaNing/thewaytowire

wire与其他同类工具的对比

Wire 是一个轻巧的Golang依赖注入工具。它由Go Cloud团队开发,通过自动生成代码的方式在编译期完成依赖注入。

依赖注入是保持软件 “低耦合、易维护” 的重要设计准则之一

同类型哦工具有:来自Uber 的 dig 、来自Facebook 的 inject,下边我们只对比下wire和dig

wire和dig的区别

uber 推出的依赖注入库,采用反射,在运行时计算依赖关系,构造依赖对象。

上面简单介绍了wire 和 dig 两者之间的特点:
1、dig 通过反射识别依赖关系,wire 是编译前计算依赖关系
2、dig 只能在代码运行时,才能知道哪个依赖不对,比如构造函数返回类型的是结构体指针,但是其他依赖的是interface,这样的错误只能在运行时发现,而wire可以在编译的时候就发现。
3、由于采用了依赖注入,所以在代码调试时可以注入一些mock 服务或者函数,wire在mock上支持更友好些,dig的话可以通过build tag 来使用mock。 个人比较推荐使用wire,可以在编译时就发现问题,避免了 多次的build和尝试后才解决编译问题。更多的使用方式和最佳实践,可以参考官方文档。
根据依赖倒置原则(Dependence Inversion Principle),对象应当依赖于接口,而不是直接依赖于具体实现。

使用wire的优势:

  • 方便debug,若有依赖缺失编译时会报错
  • 因为不需要 Service Locators, 所以对命名没有特殊要求
  • 避免依赖膨胀。生成的代码只包含被依赖的代码,而运行时依赖注入则无法作- 到这一点
  • 依赖关系静态存于源码之中, 便于工具分析与可视化

wire 中的两个核心概念: Provider 和 Injector

provider: a function that can produce a value. These functions are ordinary Go code.
injector: a function that calls providers in dependency order. With Wire, you write the injector’s signature, then Wire generates the function’s body.

  • Provider 是一个生成组件的普通函数,这个函数会返回构建依赖关系所需的组件。
  • Injector 是很多个 Provider 组装在一起的时候,可以得到一个管理对象,由wire自动生成的函数。函数内部会按根据依赖顺序调用相关privoder 。

使用wire实战

安装

  • 一、仓库地址:https://github.com/google/wire
  • 二、使用方法:
  • 1、执行 go get github.com/google/wire/cmd/wire 命令
  • 2、执行 go install github.com/google/wire/cmd/wire@latest 命令
  • 3、确认gopath中bin是否存在wire.exe或wire
  • 三、我们的代码目录结构
    route -->> controller–> service -->>Idao -->>dao ->>model

用法效果对比

wire 依赖注入方式想要达到的效果:

我们有一个主函数:

func main() {
message := NewMessage()
greeter := NewGreeter(message)
event := NewEvent(greeter)

event.Start()
}

我们改成这样:文章来源地址https://www.toymoban.com/news/detail-800296.html

func main() {
event := InitializeEvent()
event.Start()
}

代码目录结构

├── routes
│   ├── init_server.go
│   ├── routes.go
│   ├── wire.go
│   └── wire_gen.go

第一步:编写wire.go

//go:build wireinject
// +build wireinject

package routes


import (
"gdonline_backend/databases/redis"
"github.com/google/wire"
"github.com/rs/zerolog"
"gorm.io/gorm"

"gdonline_backend/internal/controller"
"gdonline_backend/internal/dao"
"gdonline_backend/internal/service"
)

var chpoPhenotype = wire.NewSet(
dao.NewChpoPhenotypeDao,
wire.Bind(new(dao.IChpoPhenotypesDao), new(*dao.ChpoPhenotypesDao)),
service.NewChpoPhenotypeService,
controller.NewChpoPhenotypesController,
)

func InitChpoPhenotypes(db *gorm.DB, log *zerolog.Logger) *controller.ChpoPhenotypesController {
panic(wire.Build(chpoPhenotype))
}

第二步:wire

第三步:生成 wire_gen.go

// Code generated by Wire. DO NOT EDIT.

//go:generate go run github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package routes

import (
"gdonline_backend/databases/redis"
"gdonline_backend/internal/controller"
"gdonline_backend/internal/dao"
"gdonline_backend/internal/service"
"github.com/google/wire"
"github.com/rs/zerolog"
"gorm.io/gorm"
)

// Injectors from wire.go:

func InitChpoPhenotypes(db *gorm.DB, log *zerolog.Logger) *controller.ChpoPhenotypesController {
chpoPhenotypesDao := dao.NewChpoPhenotypeDao(db, log)
chpoPhenotypesService := service.NewChpoPhenotypeService(chpoPhenotypesDao)
chpoPhenotypesController := controller.NewChpoPhenotypesController(chpoPhenotypesService)
return chpoPhenotypesController
}

// wire.go:

var chpoPhenotype = wire.NewSet(dao.NewChpoPhenotypeDao, wire.Bind(new(dao.IChpoPhenotypesDao), new(*dao.ChpoPhenotypesDao)), service.NewChpoPhenotypeService, controller.NewChpoPhenotypesController)


第四步:main.go 中调用

# routes>init_server.go

func InitServer() {
// 初始化数据库连接
db := mysql.DB
redisDB := redis.DB
zeroLog := logging.NewZerolog("business")

// 注册服务-wire
cc = InitChpoPhenotypes(db, zeroLog)

}

# main.go
routes.InitServer()


第五步:实际调用的路由

func Routes(r *gin.Engine) {
// 设置路由组: v1
v1 := r.Group("v1")
chpoPhenotype := v1.Group("chpo_phenotypes")
// 知识库管理
chpoPhenotype.GET("lists", cc.Lists)    // 列表接口
chpoPhenotype.GET("detail", cc.Detail)  // 获取表型详情
chpoPhenotype.POST("add", cc.Add)       // 新增
chpoPhenotype.POST("edit", cc.Edit)     // 编辑
chpoPhenotype.POST("delete", cc.Delete) // 删除
}

到了这里,关于Go新项目-Gin中wire的依赖注入方式实战(6)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go新项目-调研关于go项目中redis的使用场景,lua实战(7)

    参考地址 https://juejin.cn/post/7079756129433370638 https://blog.csdn.net/gaogaoshan/article/details/41039581 https://redis.io/docs/clients/go/ redis的使用场景的解释 下面一一来分析下Redis的应用场景都有哪些。 1、缓存 缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访

    2024年01月18日
    浏览(42)
  • Go新项目-配置文件的选取及区别和写法(1)

    先说结论:我们选型TOML yaml,toml,json,ini 实际业务都有用 实际栗子是:我们想要把Go的切片作为配置文件,YAML写起来比较吃力,TOML就很容易了。 配置文件是用于配置计算机程序的参数、初始化设置的文件、业务数据公共配置等。如果没有这些配置,我们的程序就会硬编码

    2024年01月18日
    浏览(49)
  • 当IDEA加载一个MAVEN新项目时,加载不成功,无法加载依赖的解决方法

    此文为练习项目时的错误记录 当使用IDEA引入一个MAVEN新项目时,点击Reload maven按钮加载不成功,显示如下图界面: 在项目中的代码显示报红,如下图: 经查阅相关资料及反复尝试,解决方法如下: 进入File-Project Structure-Project,确认选择好自己版本的jdk,这里使用的是jdk1.

    2024年01月19日
    浏览(71)
  • 快速学Go依赖注入工具wire

    Go相对java和C++是较新的语言,但也有诸多优秀特性及生态库。本文介绍大多数软件工程中常用的功能:依赖注入。首先介绍什么是依赖注入,go实现库wire与其他语言的差异。然后通过简单示例实现依赖注入,简化代码、提升可读性。 依赖注入是一种对象接收它所依赖的其他对

    2024年02月05日
    浏览(51)
  • Go新项目-Golang使用RemoteAddr()获取远程主机地址的注意事项(9)

    http.Request 下的方法RemoteAddr() 可以获取客户端的地址和端口号,最近的一个项目中用到了这个方法。 使用过程中一直都没有什么问题,但是当项目上线之后就发现不管怎么获取ip,客户端地址都是127.0.0.1 。 对于这个问题一直百思不得其解,最后搞了半天才发现是nginx 的原因。

    2024年01月20日
    浏览(59)
  • Gitlab 新项目搭建

    项目名称与本地新建项目名称相同 进入本地项目根目录下,右击 git bash here打开命令窗口; 初始化本地仓库; 提交至暂存区; 提交项目。 建立本地仓库和远端 Gitlab 仓库关系; 2.拉取一下远程仓库内容; 推送本地内容到远程仓库。 出现以下问题: 原因就是 Gitlab 的仓库中

    2024年02月13日
    浏览(68)
  • 新项目搞完啦!!!

    大家好,我是鱼皮。 经过了 7 场直播,总时长近 20 小时,我在 自己的编程导航 的第 5 个 全程直播开发 的项目 —— 智能 BI 项目,完结啦! 我在这里对该项目做一个简单的总结,希望让更多需要它的同学看到,把它变成自己的项目~ 这次做的是一个顺应潮流的项目, 基于

    2024年02月11日
    浏览(66)
  • 新项目如何推送Git

    一、在git新建一个空的仓库,不用任何模版,直接创建即可 完成后,copy仓库地址 二、本地新建项目,进入到本地项目命令行,也可以打开终端,其实是相通的:执行命令git init, 此时在项目上右击就发想有git选项,点击add添加,接着正常commit,然后push 在push的时候会发现有

    2024年02月12日
    浏览(69)
  • 笔记 | FastAPI创建新项目

    当使用FastAPI创建项目时,首先需要安装FastAPI和其依赖项。可以使用pip来安装它们。请确保已经安装了Python和pip。 创建项目文件夹并进入该文件夹: 创建并激活一个新的Python虚拟环境(可选,但强烈推荐): 安装FastAPI和uvicorn(FastAPI的服务器): 创建一个名为 main.py 的文件

    2024年02月06日
    浏览(66)
  • idea新项目上传git

    关于idea新项目怎么上传到git,今天整理一下操作的步骤。来做一个记录! 1.首先要在项目上右击打开终端或者在idea的下方有一个快捷按钮 按照上面的截图进行操作,打开终端窗口 2.然后在终端窗口中输入 git init 命令,会出现如图样子 3.然后右击项目会出现git的选项,然后按

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包