山东网站建设和游戏开发的公司,增城企业网站建设,怎样制造网站图片教程,微信指数怎么看1. wire 简介
wire 是一个 Golang 的依赖注入框架#xff08;类比 Spring 框架提供的依赖注入功能#xff09; ⭐ 官方文档#xff1a;https://github.com/google/wire 这里关乎到编程世界当中一条好用的设计原则#xff1a;A用到了B#xff0c;那么B一定是通过依赖注入的…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/wirelatest 温馨提示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/gormtype UserDAO struct {db *gorm.DB
}func NewUserDAO(db *gorm.DB) *UserDAO {return UserDAO{db: db,}
}
repository/user.go
package repositoryimport wire_demo/repository/daotype UserRepository struct {userDAO *dao.UserDAO
}func NewUserRepository(userDAO *dao.UserDAO) *UserRepository {return UserRepository{userDAO: userDAO,}
}
service/user.go
package serviceimport wire_demo/repositorytype UserService struct {repo *repository.UserRepository
}func NewUserService(repo *repository.UserRepository) *UserService {return UserService{repo: repo,}
}
web/user.go
package webimport (github.com/gin-gonic/ginnet/httpwire_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/mysqlgorm.io/gorm
)func InitDB() *gorm.DB {db, err : gorm.Open(mysql.Open(root:QWEzxc123456tcp(localhost:3306)/webook))if err ! nil {panic(err)}return db
}
3. wire 快速入门
步骤一在项目根目录下创建wire.go
//go:build wireinjectpackage mainimport (github.com/google/wirewire_demo/repositorywire_demo/repository/daowire_demo/servicewire_demo/web
)func Init() *web.UserHandler {wire.Build(InitDB,dao.NewUserDAO,repository.NewUserRepository,service.NewUserService,web.NewUserHandler,)return new(web.UserHandler)
}温馨提示 在文件上方使用固定格式 //go:build wireinject 表明这是依赖注入的编译模板文件创建一个函数内部使用 wire.Build 方法传入各种构造方法wire 会自动分析依赖关系返回值无所谓wire 内部会帮你进行替换 步骤二在 wire.go 同级目录下命令行执行wire命令 此时也会发现项目同级目录出现一个wire_gen.go文件这就是编译生成的文件内部已经帮你写好了各种构造方法以及依赖之间的传递
步骤三在 main.go 文件中正常使用即可
package mainimport github.com/gin-gonic/ginfunc main() {server : gin.Default()userHandler : Init()userHandler.RegisterRoutes(server)server.Run(:8080)
}