golang wire 依赖注入

1 安装wire

1.1 通过命令直接安装

go install github.com/google/wire/cmd/wire@latest

1.2 通过go get方式安装

go get github.com/google/wire/cmd/wire

进入目录编译

cd C:\Users\leell\go\pkg\mod\github.com\google\wire@v0.6.0\cmd\wire
go build

然后将wire.exe移动到 C:\Users\leell\go\bin目录下

具体目录通过go env进行查看

C:\Users\leell\go>go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=C:\Users\leell\go\bin

2  业务源码

//Handler 源码
type Handler struct {conf   *viper.Viperlogger *zap.Logger
}func NewHandler(conf *viper.Viper, logger *zap.Logger) *Handler {return &Handler{conf: conf, logger: logger}
}//RoleHandler 源码
type RoleHandler struct {*HandlerroleService *service.RoleService
}func NewRoleController(controller *Handler, roleService *service.RoleService) *RoleHandler {return &RoleHandler{Handler:     controller,roleService: roleService,}
}//RoleService 源码
type RoleService struct {*ServiceroleDao *dao.RoleDao
}func NewRoleService(service *Service, roleDao *dao.RoleDao) *RoleService {return &RoleService{Service: service,roleDao: roleDao,}
}//RoleDao源码
type RoleDao struct {*Dao
}func NewRoleDao(dao *Dao) *RoleDao {return &RoleDao{Dao: dao}
}//Dao 源码
type Dao struct {conf   *viper.Viperlogger *zap.Logger
}func NewDao(conf *viper.Viper, logger *zap.Logger) *Dao {return &Dao{conf: conf, logger: logger}
}

3 provider 提供者

provider/provider.go

package providerimport ("github.com/google/wire""wire-first/dao""wire-first/handler""wire-first/server""wire-first/service"
)var ServerSet = wire.NewSet(server.NewServerHttp)var HandlerSet = wire.NewSet(handler.NewHandler, handler.NewUserController, handler.NewRoleController)var ServiceSet = wire.NewSet(service.NewService, service.NewUserService, service.NewRoleService)var DaoSet = wire.NewSet(dao.NewDao, dao.NewUserDao, dao.NewRoleDao)

4 wire提供生成构建代码

wire/wire.go

//go:build wireinject
// +build wireinjectpackage wireimport ("net/http""github.com/google/wire""github.com/spf13/viper""go.uber.org/zap""wire-first/provider"
)// wire.go 初始化模块
func NewApp(*viper.Viper, *zap.Logger) (*http.Server, error) {panic(wire.Build(provider.ServerSet,provider.HandlerSet,provider.ServiceSet,provider.DaoSet,))
}

5 通过wire生成gen代码 

PS G:\github\wire-first> wire  gen wire/wire.go
wire: command-line-arguments: wrote G:\github\wire-first\wire\wire_gen.go

6 结果查看

wire/wire_gen.go

// Code generated by Wire. DO NOT EDIT.//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinjectpackage wireimport ("github.com/spf13/viper""go.uber.org/zap""net/http""wire-first/dao""wire-first/handler""wire-first/server""wire-first/service"
)// Injectors from wire.go:// wire.go 初始化模块
func NewApp(viperViper *viper.Viper, logger *zap.Logger) (*http.Server, error) {handlerHandler := handler.NewHandler(viperViper, logger)serviceService := service.NewService(viperViper, logger)daoDao := dao.NewDao(viperViper, logger)userDao := dao.NewUserDao(daoDao)userService := service.NewUserService(serviceService, userDao)userHandler := handler.NewUserController(handlerHandler, userService)roleDao := dao.NewRoleDao(daoDao)roleService := service.NewRoleService(serviceService, roleDao)roleHandler := handler.NewRoleController(handlerHandler, roleService)httpServer := server.NewServerHttp(viperViper, logger, userHandler, roleHandler)return httpServer, nil
}

7 main.go代码

package mainimport ("github.com/alecthomas/kingpin/v2""go.uber.org/zap""wire-first/config""wire-first/wire"
)var (cfgPath = kingpin.Flag("config", "the path of the config file").Default("app.yml").String()
)func main() {kingpin.Parse()conf := config.NewConfig(*cfgPath)// 创建loggerlogger, err := zap.NewDevelopment()if err != nil {panic(err)}defer logger.Sync()app, err := wire.NewApp(conf, logger)if err != nil {logger.Error("Initialization failed",zap.Error(err),)}logger.Info("Server's running", zap.String("address", app.Addr))if err := app.ListenAndServe(); err != nil {logger.Error("Server Error",zap.String("key", "value"),zap.Error(err),)}
}

源码:wire-first: 依赖注入库wire的示例工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【神经网络结构可视化】PlotNeuralNet的安装、测试及创建自己的神经网络结构可视化图形

文章目录 前提准备1、下载MikTeX2、下载Git bash3、下载PlotNeuralNet 进行测试1、解压PlotNeuralNet-master.zip2、打开Git bash3、 在my_project中查看生成的pdf文件 创建自己的神经网络结构可视化图形 前提准备 1、下载MikTeX 下载链接: MikTeX ( https://mikt…

【图解计算机网络】TCP协议三次握手与四次挥手

TCP协议三次握手与四次挥手 三次握手流程为什么是三次握手,而不是两次或四次四次挥手流程TIME_WAIT 为什么要等待 2MSL为什么握手是三次,挥手是四次? 三次握手流程 首先是客户端(也就是我们的浏览器)发送一个SYN标志位…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一,队列的概念 队列是一种特殊的受限制的线性表。 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的t(First In First Out)的线性表,简称FIF…

请编写函数fun,其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

NDK 基础(五)—— C++ 高级特性2

1、左值右值 在 C 中,左值(lvalue)和右值(rvalue)是用于描述表达式的术语,它们与赋值操作和内存中对象的生命周期有关。 **左值(lvalue)**是指可以出现在赋值操作符左侧的表达式&a…

MySQL建立联合索引 及其失效原理讲解

前言 在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。 mysql使用联合索引时,需要注意的是联合索引的最左匹配原则。 mysql联合索引原理及失效原理 MySQL 联合索引(也称为复…

商店数据(九)

目录 65.店铺入驻字段表 66.店铺分类表 67.店铺配置表 68.店铺快递公司关联表 69.店铺资料附加表 70.店铺入驻流程表 71.店铺运费模板表 72.消息类型表 65.店铺入驻字段表 CREATE TABLE wst_bases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,flowld int(11)…

如何安全进行速卖通自养号测评操作?

对于新加入的卖家而言,进行销量测评显得尤为关键。速卖通平台上的新店往往难以获得活动的扶持,且初始流量相当有限。因此,开店的首要任务便是积极展开测评工作,努力积累初始的评论和销售记录。测评的益处颇为显著,它不…

SpringBoot项目启动,传参有哪些方式?

SpringBoot项目启动,传参有哪些方式? 1.Spring级别的参数 直接在启动 Spring Boot 应用的命令行中使用 -- 后跟参数名和值的方式来传递参数。 记住:一般是对于Spring Boot应用特有的配置参数,确保它们遵循Spring Boot的配置属性命…

【视频打架行为数据集】打斗场景视频数据集简要介绍

一、UBI-Fight(异常事件检测数据集) 介绍 UBI-Fights 数据集是一个独特的全新大型数据集,涉及特定的异常检测并仍然在打斗场景中提供广泛的多样性,该数据集包含 80 小时的视频,在帧级别进行了完全注释。由 1000 个视…

# 从浅入深 学习 SpringCloud 微服务架构(五)Consul(2)

从浅入深 学习 SpringCloud 微服务架构(五)Consul(2) 段子手168 一、consul 集群:consul 集群的基础知识 1、启动 sonsul 服务命令: 以开发者模式快速启动: consul agent -dev -client0.0.0…

13.JAVAEE之HTTP协议

HTTP 最新的版本应该是 HTTP/3.0 目前大规模使用的版本 HTTP/1.1 使用 HTTP 协议的场景 1.浏览器打开网站 (基本上) 2.手机 APP 访问对应的服务器 (大概率) 学习 HTTP 协议, 重点学习 HTTP 的报文格式 前面的 TCP/IP/UDP 和这些不同, HTTP 的报文格式,要分两个部分来看待.请求…

移动端日志采集与分析最佳实践

前言 做为一名移动端开发者,深刻体会日志采集对工程师来说具有重要意义,遇到问题除了 debug 调试就是看日志了,通过看日志可以帮助我们了解应用程序运行状况、优化用户体验、保障数据安全依据,本文将介绍日志采集的重要性、移动端…

高级防爬还得是公众号

平时一天也就1K的流量,最近流量暴涨,已经用自研的WAF防火墙阻挡了很多恶意攻击和爬虫,已经过滤掉很多低级攻击和爬取了。 多出的流量,也仅仅多了一个导航 dh.yu7s.com 用户,多时没有用的机器人爬虫,不封掉浪…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中,有时会发现公司里的报表,经过多人多次的重复的使用和修改后,会出现这种情况: 1.在表格里按照需要输入数字,保存工作簿。 2.然而,再次打开工作簿,里面的数字变成日期&a…

c#学习入门2

十、运算符 1)算术运算符是用于数值类型变量计算的运算符,它返回的结果是数值 1.赋值符号 2.算数运算符 加 减- 乘* 除/ 取余% 3.算数运算符的优先级 4.算术运算符的复合运算 5.算术运算符的自增减 2)字符串拼接 1.字符串拼接方式1 注意&…

自定义View-旋转变色圆角三角形的绘制

本文字数:3151字 预计阅读时间:20分钟 在现代设计中,动效图在APP的UI界面中所起到的作用无疑是显著的。相比于静态的界面,动效更符合人类的自然认知体系,它有效地降低了用户的认知负载,UI动效俨然已经成为了…

错误代码126:加载d3dcompiler_43.dll失败,分享多种解决方法

在正常使用电脑的过程中,当我尝试启动并运行一款心仪的游戏时,系统却突然弹出一个令人困扰的错误提示“错误代码126:加载d3dcompiler_43.dll失败”,它会导致游戏无法正常运行。为了解决这个问题,我经过多次尝试和总结,…

Docker容器配置进阶

一、容器的自动重启 Docker提供重启策略选项控制容器退出时或Docker重启时是否自动启动该容器。重启策略能够确保关联的多个容器按照正确的顺序启动。Docker建议使用重启策略,并避免使用进程管理器启动容器。运行容器时可以使用--restart选项指定重启策略。容器的重…

VMware ESXi虚拟机备份的方法和步骤

关于虚拟机备份 VMware ESXi 是 VMware vSphere 企业虚拟化套件的核心组件。在版本4.1之前,它一直被称为ESX。ESXi是一种裸机管理程序,直接安装在物理服务器上,它提供对底层资源的直接访问和控制,允许您在单个物理主机上创建和运…