一个最小的 Go + Gin + GORM 教程项目,演示如何使用 Google Wire 做依赖注入。包含基于 SQLite 的简单 User API。
go install github.com/google/wire/cmd/wire@latestgo mod tidy
该项目展示了从全局变量到手动 wiring,再到 Google Wire 的演进过程。
目标:快速跑通。
core/ 中创建全局单例(DB、Logger)。示意(仅概念):
core 暴露 DB 与 Loggerservice 和 api 直接使用 core.DB / core.Logger缺点:耦合高、难测试、依赖不显式。
目标:让依赖显式、可测试。
core.NewDB()core.NewLogger()service.NewUserService(db, logger)api.NewUserApi(userService)router.NewUserRouter(api)main.go 中手动拼装依赖。这样每一层依赖都来自参数(无全局变量)。
目标:避免重复手动 wiring。
wire/wire.go 创建 Wire 注入器(build tag: wireinject)。wire.Build(...) 中注册 provider:
core.NewDBcore.NewLoggerservice.NewUserServiceapi.NewUserApirouter.NewUserRouterProviderwire_gen.go:wire ./wire
Wire 会生成完整依赖图,并提供 InitWire() 返回 *gin.Engine。
main.go 中调用 wire.InitWire() 替代手动 wiring。至此,依赖显式、可测试,并自动装配。
core/ 中创建并注入到 service 与 api。logger.Info("message")logger.Error("message", zap.Error(err))wire ./wire
go run .
GET /api/user?id=1
示例:
curl "http://localhost:8080/api/user?id=1"
test.dbwire/ 中补充 provider。