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

【Go】Go wire 依赖注入

1. wire 简介

wire 是一个 Golang 的依赖注入框架(类比 Spring 框架提供的依赖注入功能)

⭐ 官方文档:https://github.com/google/wire

这里关乎到编程世界当中一条好用的设计原则:A用到了B,那么B一定是通过依赖注入的方式提供给A的

举一个例子:现在有一个 CodeService(验证码服务)需要调用到 SmsService(短信服务)来完成发送验证码的功能,此时在 CodeService 内部是不知道也不应该了解如何初始化 SmsService 的,那么就要求由外部传入已经构造好的 SmsService 实例

依赖注入有以下优点:

  • 依赖方与被依赖方耦合度较低
  • 可以复用公共组件(比如 MySQL、Redis 等数据库连接对象)
  • 测试方便
  • 扩展性良好

2. wire 安装与下载

下载 wire 对应源码包:go install github.com/google/wire/cmd/wire@latest

💡 温馨提示:install 命令会自动将 wire 下载到 GOPATH 下的 bin 目录,只有配置该路径环境变量才能使用 wire 命令

3. 项目基本结构

该实例项目参考 DDD 架构规范:

  • repository:领域对象的存储
    • dao:存储到关系型数据库
  • service:领域对象的行为(业务相关)
  • web:与 HTTP 请求交互
  • db.go:初始化数据库连接
  • wire.go:依赖注入代码实现
  • main.go:项目启动入口
  • wire_gen.go:依赖注入生成的文件

repository/dao/user.go

package daoimport "gorm.io/gorm"type UserDAO struct {db *gorm.DB
}func NewUserDAO(db *gorm.DB) *UserDAO {return &UserDAO{db: db,}
}

repository/user.go

package repositoryimport "wire_demo/repository/dao"type UserRepository struct {userDAO *dao.UserDAO
}func NewUserRepository(userDAO *dao.UserDAO) *UserRepository {return &UserRepository{userDAO: userDAO,}
}

service/user.go

package serviceimport "wire_demo/repository"type UserService struct {repo *repository.UserRepository
}func NewUserService(repo *repository.UserRepository) *UserService {return &UserService{repo: repo,}
}

web/user.go

package webimport ("github.com/gin-gonic/gin""net/http""wire_demo/service"
)type UserHandler struct {userSvc *service.UserService
}func NewUserHandler(userSvc *service.UserService) *UserHandler {return &UserHandler{userSvc: userSvc,}
}func (u *UserHandler) SayHello(ctx *gin.Context) {ctx.String(http.StatusOK, "Hello,World!")return
}func (u *UserHandler) RegisterRoutes(server *gin.Engine) {server.GET("/hello", u.SayHello)
}

db.go

package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"
)func InitDB() *gorm.DB {db, err := gorm.Open(mysql.Open("root:QWEzxc123456@tcp(localhost:3306)/webook"))if err != nil {panic(err)}return db
}

3. wire 快速入门

步骤一:在项目根目录下创建wire.go

//go:build wireinjectpackage mainimport ("github.com/google/wire""wire_demo/repository""wire_demo/repository/dao""wire_demo/service""wire_demo/web"
)func Init() *web.UserHandler {wire.Build(InitDB,dao.NewUserDAO,repository.NewUserRepository,service.NewUserService,web.NewUserHandler,)return new(web.UserHandler)
}

💡 温馨提示:

  1. 在文件上方使用固定格式 //go:build wireinject 表明这是依赖注入的编译模板文件
  2. 创建一个函数内部使用 wire.Build 方法,传入各种构造方法,wire 会自动分析依赖关系
  3. 返回值无所谓(wire 内部会帮你进行替换)

步骤二:在 wire.go 同级目录下命令行执行wire命令

此时也会发现项目同级目录出现一个wire_gen.go文件,这就是编译生成的文件(内部已经帮你写好了各种构造方法以及依赖之间的传递)

步骤三:在 main.go 文件中正常使用即可!

package mainimport "github.com/gin-gonic/gin"func main() {server := gin.Default()userHandler := Init()userHandler.RegisterRoutes(server)server.Run(":8080")
}

相关文章:

【Go】Go wire 依赖注入

1. wire 简介 wire 是一个 Golang 的依赖注入框架(类比 Spring 框架提供的依赖注入功能) ⭐ 官方文档:https://github.com/google/wire 这里关乎到编程世界当中一条好用的设计原则:A用到了B,那么B一定是通过依赖注入的…...

深度集成DeepSeek与Java开发:智能编码新纪元全攻略 [特殊字符]

一、DeepSeek:Java开发者的第二大脑 🧠 1.1 传统开发痛点VS智能开发体验 传统开发DeepSeek智能辅助效率提升对比手动编写重复代码一键生成模板代码代码量减少70%↑调试全靠断点日志智能定位缺陷根源问题排查时间缩短60%↓文档维护耗时费力自动生成更新…...

WEB前端将指定DOM生成图片并下载最佳实践(html2canvas)

前言: html2canvas 是一个 JavaScript 库,其主要作用是将 HTML 元素或其部分内容渲染为 Canvas 图像。通过它,开发者可以将网页中的任意 DOM 元素(包括文本、图片、样式等)转换为图片格式(如 PNG 或 JPEG&…...

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者,在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践,帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …...

深度学习学习笔记(34周)

目录 摘要 Abstracts 简介 Hourglass Module(Hourglass 模块) 网络结构 Intermediate Supervision(中间监督) 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…...

C++ 设计模式-备忘录模式

游戏存档实现&#xff0c;包括撤销/重做、持久化存储、版本控制和内存管理 #include <iostream> #include <memory> #include <deque> #include <stack> #include <chrono> #include <fstream> #include <sstream> #include <ct…...

TOGAF之架构标准规范-信息系统架构 | 应用架构

TOGAF是工业级的企业架构标准规范&#xff0c;信息系统架构阶段是由数据架构阶段以及应用架构阶段构成&#xff0c;本文主要描述信息系统架构阶段中的应用架构阶段。 如上所示&#xff0c;信息系统架构&#xff08;Information Systems Architectures&#xff09;在TOGAF标准规…...

第一届网谷杯

统计四场的所有题目&#xff08;共计12题&#xff0c;四场比赛一共上了21题【包括换题】&#xff09; 随便记记&#xff0c;以免老题复用&#xff08;已经复用了&#xff09; Web 文件包含 1 伪协议 http://120.202.175.143:8011/?cphp://filter/convert.base64-encode/reso…...

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式&#xff0c;以快速运行自动化任务或脚本&#xff0c;无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…...

mysql -DQL语句和DCL语句

DQL 数据查询语言&#xff08;Data Query Language&#xff0c;DQL&#xff09;是数据库操作语言的重要组成部分&#xff0c;主要用于从数据库中检索数据&#xff0c;核心关键字为SELECT。以下从语法结构、常见操作及示例等方面详细介绍&#xff1a; 语法结构 DQL 的标准语法…...

掌握 ElasticSearch 组合查询:Bool Query 详解与实践

掌握 ElasticSearch 组合查询&#xff1a;Bool Query 详解与实践 一、引言 (Introduction)二、Bool 查询基础2.1 什么是 Bool 查询&#xff1f;2.2 Bool 查询的四种子句2.3 语法结构 三、Bool 查询的四种子句详解与示例3.1 must 子句3.2 filter 子句3.3 should 子句3.4 must_no…...

C++ 类和对象(友元、内部类、匿名对像)

目录 一、前言 二、正文 1.友元 1.1友元函数的使用 1.1.1外部友元函数可访问类的私有成员&#xff0c;友员函数仅仅是一种声明&#xff0c;他不是类的成员函数。 1.1.2一个函数可以是多个类的友元函数 2.友元类的使用 2.1什么是友元类 2.2 友元类的关系是单向的&#x…...

PostgreSQL 常用函数

PostgreSQL 常用函数 在数据库管理系统中&#xff0c;函数是执行特定任务的基本构建块。PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;提供了丰富的内置函数&#xff0c;这些函数极大地增强了数据库操作的能力。以下是一些在 PostgreSQL 中常用的函数&#…...

掌握 ElasticSearch 四种match查询的原理与应用

文章目录 一、引言 (Introduction)二、准备工作&#xff1a;创建索引和添加示例数据三、match 查询四、match_all 查询五、multi_match 查询六、match_phrase 查询七、总结 (Conclusion) 一、引言 (Introduction) 在信息爆炸的时代&#xff0c;快速准确地找到所需信息至关重要…...

解决:Conda虚拟环境中未设置CUDA_HOME的问题

背景&#xff1a;我是Ubuntu22.04系统&#xff0c;最近在复现FoundationPose算法&#xff0c;按照README构建部署环境时&#xff0c;有一步一直卡住&#xff0c;看了下是未找到CUDA_HOME这个环境变量。 网上搜了下这个错误&#xff0c;需要设置CUDA_HOME的环境变量路径&#x…...

easyexcel和poi同时存在版本问题,使用easyexcel导出excel设置日期格式

这两天在使用easyexcel导出excel的时候日期格式全都是字符串导致导出的excel列无法筛选 后来调整了一下终于弄好了&#xff0c;看一下最终效果 这里涉及到easyexcel和poi版本冲突的问题&#xff0c;一直没搞定&#xff0c;最后狠下心来把所有的都升级到了最新版&#xff0c;然…...

HarmonyOS 开发套件 介绍——下篇

HarmonyOS 开发套件 介绍——下篇 在HarmonyOS的生态中&#xff0c;开发套件作为支撑整个系统发展的基石&#xff0c;为开发者提供了丰富而强大的工具和服务。本文将深入继续介绍HarmonyOS SDK、ArkCompiler、DevEco Testing、AppGallery等核心组件&#xff0c;帮助开发者全面掌…...

关于order by的sql注入实验

实验描述 本实验基于sqli-lab的第46关进行测试 本关的sql 语句为$sql "SELECT * FROM users ORDER BY $id" 利用sort进行sql注入&#xff0c;我们可以利用报错注入&#xff0c;延时注入来爆出数据 1.报错注入 1.手工测试 爆出数据库 ?sort(extractvalue(1, c…...

Transformers快速入门-学习笔记

一、自然语言处理 NLP 是借助计算机技术研究人类语言的科学自然语言处理发展史 一、不懂语法怎么理解语言 依靠语言学家人工总结文法规则 Chomsky Formal Languages 难点&#xff1a;上下文有关文法 规则增多&#xff0c;存在矛盾 二、只要看得足够多&#xff0c;就能处理语言…...

luci界面开发中的MVC架构——LuCI介绍(二)

想要给openwrt开发应用&#xff0c;虽然直接可执行程序也可以运行&#xff0c;但是没有UI会很不方便&#xff0c;想要开发UI就要用openwrt的那一套&#xff0c;自然就是LuCI&#xff0c;LuCI又用了一套MVC框架&#xff0c;今天就讲讲这是个什么东西。 OpenWrt LuCI 界面开发中…...

3D Face HRN快速上手指南:本地运行+外网分享,无需配置环境

3D Face HRN快速上手指南&#xff1a;本地运行外网分享&#xff0c;无需配置环境 想不想把一张普通的自拍照&#xff0c;瞬间变成可以360度旋转、能导入到游戏或动画里的3D人脸模型&#xff1f;听起来像是电影里的黑科技&#xff0c;但现在&#xff0c;你只需要一个浏览器就能…...

XUnity.AutoTranslator终极指南:5分钟让Unity游戏告别语言障碍

XUnity.AutoTranslator终极指南&#xff1a;5分钟让Unity游戏告别语言障碍 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的日文、英文游戏而烦恼吗&#xff1f;XUnity.AutoTranslator正是你…...

如何高效使用fre:ac音频转换器:从入门到精通的完整指南

如何高效使用fre:ac音频转换器&#xff1a;从入门到精通的完整指南 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac fre:ac音频转换器是一款功能强大、完全免费的开源工具&#xff0c;专为音乐爱好者和专…...

老队员的建议:怨天不由人,收获在自己

简 介&#xff1a; 【】一位往届选手针对智能车竞赛自制车模争议提出建议&#xff1a;1&#xff09;反对因自制车模被超越而要求改规则的行为&#xff0c;认为应通过提升设计水平公平竞争&#xff1b;2&#xff09;强调比赛"立足培养"的宗旨应兼顾基础薄弱学生&#…...

从Xilinx Zynq迁移到复旦微FMQL:调试PS网口时,我踩过的那些设备树配置的坑

从Xilinx Zynq迁移到复旦微FMQL&#xff1a;PS网口设备树配置避坑指南 当第一次在复旦微FMQL开发板上看到熟悉的GMAC网口时&#xff0c;我下意识地复制了Zynq项目的设备树配置——毕竟都是ARM Cortex-A系列处理器搭配可编程逻辑的架构&#xff0c;能有多大区别&#xff1f;直到…...

2小时,我给公司做了一套采购台账,老板第一次看明白成本!

很多公司都有采购台账&#xff0c;而且表面上看&#xff0c;还都做得不差。日期、物料、供应商、单价、数量、金额&#xff0c;一样不少。但真正拿给老板看时&#xff0c;老板还是总会继续追问&#xff1a;为什么这个价格、为什么选这家、为什么这个月成本高了&#xff1f;这让…...

Go语言的sync.Cond事件驱动

Go语言中的sync.Cond&#xff1a;事件驱动的高效同步机制 在并发编程中&#xff0c;协调多个goroutine的执行顺序是一项关键挑战。Go语言的sync.Cond&#xff08;条件变量&#xff09;为开发者提供了一种高效的事件驱动机制&#xff0c;能够基于特定条件实现goroutine的阻塞与…...

3D 地球卫星轨道可视化平台开发 Day10(交互升级与接口溯源)

在基于Three.js开发3D地球卫星轨道可视化平台的过程中&#xff0c;随着需求的迭代&#xff0c;原有界面交互和功能模块逐渐无法满足用户精准查看卫星数据的需求。本次优化聚焦三大核心目标&#xff1a;删除冗余的卫星动态选项、新增知名卫星系列筛选功能、完善交互体验实现单系…...

c++怎么获取文件的压缩比例信息_Windows压缩卷特性【详解】.txt

...

别再手动导数据库了!Go-Admin项目新手避坑指南:从GitHub克隆到一键启动的完整流程

Go-Admin项目零基础实战&#xff1a;从GitHub克隆到自动化部署的全链路指南 第一次接触Go-Admin这类全栈脚手架时&#xff0c;很多开发者会陷入"手动导入SQL→配置混乱→无法登录"的死循环。本文将彻底打破这种传统认知&#xff0c;展示如何通过自动化工作流规避90%的…...