当前位置:首页 > 科技  > 软件

Go 语言中怎么使用依赖注入?

来源: 责编: 时间:2024-04-02 17:24:08 319观看
导读1 、介绍在 Go 语言项目开发中,我们处理组件层级之间的依赖关系时,通常我们会先在依赖层级的代码中实例化被依赖层级,然后调用它的方法,即依赖方需要主动获取被依赖方。但是,当被依赖层级的代码发生变化时,依赖层级的代码也

1 、介绍

在 Go 语言项目开发中,我们处理组件层级之间的依赖关系时,通常我们会先在依赖层级的代码中实例化被依赖层级,然后调用它的方法,即依赖方需要主动获取被依赖方。lWh28资讯网——每日最新资讯28at.com

但是,当被依赖层级的代码发生变化时,依赖层级的代码也需要修改,耦合性比较高,代码不方便扩展。lWh28资讯网——每日最新资讯28at.com

所谓依赖注入,即依赖方不再需要主动获取被依赖方,而是被依赖方主动传递给依赖方。lWh28资讯网——每日最新资讯28at.com

本文我们介绍 Go 语言怎么使用依赖注入。lWh28资讯网——每日最新资讯28at.com

2 、Go 语言使用依赖注入

在 Go 语言中,怎么使用依赖注入呢?我准备以 clean arch 架构的代码讲解。lWh28资讯网——每日最新资讯28at.com

推荐读者朋友们先阅读我之前写的一遍文章 「Go 语言整洁架构实践」。lWh28资讯网——每日最新资讯28at.com

参照 Bob 大叔的一篇关于整洁架构的文章 The Clean Architecture,我们分 4 个层级:lWh28资讯网——每日最新资讯28at.com

  • Models
  • Repository
  • Usecase
  • Delivery

限于篇幅,本文主要介绍在 Go 语言中使用构造函数的方式实现依赖注入,读者朋友们可以在留言区分享其它实现方式。lWh28资讯网——每日最新资讯28at.com

示例代码:lWh28资讯网——每日最新资讯28at.com

// Models 层type Todolist struct { Id      int64  `json:"id"` Title   string `json:"title"` Status  int    `json:"status"` Created int    `json:"created"` Updated int    `json:"updated"`}type TodoListRepository interface { Create(ctx context.Context, t *Todolist) (err error)}type TodoListUsecase interface { Create(context.Context, *Todolist) (err error)}// Repository 层type mysqlTodoListRepository struct { Conn *sql.DB}func NewMysqlTodoListRepository(Conn *sql.DB) models.TodoListRepository { return &mysqlTodoListRepository{Conn}}func (m *mysqlTodoListRepository) Create(ctx context.Context, t *models.Todolist) (err error) { // ... return}// Usecase 层type todoListUsecase struct { todoListRepo models.TodoListRepository}func NewTodoListUsecase(t models.TodoListRepository) models.TodoListRepository { return &todoListUsecase{  todoListRepo: t, }}func (tl *todoListUsecase) Create(ctx context.Context, t *models.Todolist) (err error) { if t.Title == "" {  return fmt.Errorf("illegal parameter") } return tl.todoListRepo.Create(ctx, t)}// Delivery 层type TodoListHandler struct { TodoListUsecase models.TodoListUsecase}func NewTodoListHandler(r *gin.Engine, todoListUsecase models.TodoListUsecase) { handler := &TodoListHandler{  TodoListUsecase: todoListUsecase, } r.POST("/create", handler.Create) r.Run()}// main 函数func main() { conn, err := sql.Open(`mysql`, "root:root@tcp(127.0.0.1:3306)/todolist") if err != nil {  log.Fatal(err) } r := gin.Default() todoListRepository := mysql.NewMysqlTodoListRepository(conn) todoListUsecase := usecase.NewTodoListUsecase(todoListRepository) http.NewTodoListHandler(r, todoListUsecase)}

阅读上面这段代码,我们可以发现 Repository 层依赖数据库驱动 conn,Usecase 层依赖 Repository 层,Delivery 层依赖 Usecase 层。lWh28资讯网——每日最新资讯28at.com

以 Repository 层和 Usecase 层为例,我们可以发现 Usecase 层通过构造函数 func NewTodoListUsecase(t models.TodoListRepository) models.TodoListRepository 将其依赖项 models.TodoListRepository 以参数的形式传递过来,并将其放入 todoListUsecase 结构体中。lWh28资讯网——每日最新资讯28at.com

所以,我们使用 Usecase 层的构造函数 NewTodoListUsecase 创建 Usecase 对象时,需要先使用 Repository 层的构造函数 NewMysqlTodoListRepository 创建 Repository 对象,并将其以参数的形式传递给 Usecase 层的构造函数 NewTodoListUsecase。lWh28资讯网——每日最新资讯28at.com

通过依赖注入的方式,可以有效降低组件层级之间的耦合性,方便代码的扩展。比如示例代码中 Repository 层的方法修改代码,不会影响 Usecase 层的代码。lWh28资讯网——每日最新资讯28at.com

3 、依赖注入工具

除了手写依赖注入代码,我们也可以使用依赖注入工具,开源社区有很多依赖注入工具,其中比较流行的主要有以下 3 个。lWh28资讯网——每日最新资讯28at.com

Google 开源的依赖注入工具 Wire[1],它是一个代码生成工具,也就是说它是在编译时自动生成代码。lWh28资讯网——每日最新资讯28at.com

另外 2 个依赖注入工具是在运行时基于 Go 反射实现,分别是 uber开源的依赖注入工具 Dig[2] 和 facebook 开源的依赖注入工具[3]。lWh28资讯网——每日最新资讯28at.com

读者朋友们可以根据实际开发中的需求,选择合适的工具。lWh28资讯网——每日最新资讯28at.com

4 、总结

读者朋友们可能已经发现,依赖注入实际上就是面向对象五大原则之一,依赖倒置原则的实现方式。lWh28资讯网——每日最新资讯28at.com

我们可以在 Go 项目开发中,使用依赖注入的方式,降低组件层级之间的代码耦合性,使代码更方便扩展。lWh28资讯网——每日最新资讯28at.com

参考资料

[1]Google 开源的依赖注入工具 Wire: https://github.com/google/wirelWh28资讯网——每日最新资讯28at.com

[2]uber开源的依赖注入工具 Dig: https://github.com/uber-go/diglWh28资讯网——每日最新资讯28at.com

[3]facebook 开源的依赖注入工具: https://github.com/facebookarchive/injectlWh28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80900-0.htmlGo 语言中怎么使用依赖注入?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 实战三个有趣案例,十分钟入门Canvas

下一篇: 无需花一分钱:轻松获取SSL证书的三种方法

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从“最美JK”起到“最美女星&r
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • 支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    2023年7月4日,“无损音质,声动人心”iQOO TWS 1正式发布,支持aptX Lossless无损传输,限时优惠价369元。iQOO TWS 1耳机率先支持端到端aptX Lossless无
Top