golang wire 依赖注入

2024-04-28 06:12
文章标签 golang 依赖 注入 wire

本文主要是介绍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的示例工程

这篇关于golang wire 依赖注入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排