内容简介:依赖注入,控制反转 设计模式目的:实现模块与项目的解耦实现流程
依赖注入,控制反转 设计模式
目的:实现模块与项目的解耦
实现流程
首先模块有指针,其次DI拿到指针,再次DI将指针赋给调用者
共调研了三个框架:iris内置的di&mvc,uber-dig,google/wire
最终决定使用 wire
google DI 框架 wire
它通过使用代码生成构建容器来避免运行时反射。
用法:
// file main.go
package main
import "bytes"
type Logger struct{}
func (logger *Logger) Log(message string) {
println(message)
}
type HttpClient struct {
logger *Logger
}
func (client *HttpClient) Get(url string) string {
client.logger.Log("Getting " + url)
return "my response from " + url
}
func NewHttpClient(logger *Logger) *HttpClient {
return &HttpClient{logger}
}
type ConcatService struct {
logger *Logger
client *HttpClient
}
func NewConcatService(logger *Logger, client *HttpClient) *ConcatService {
return &ConcatService{logger, client}
}
func (service *ConcatService) GetAll(urls ...string) string {
service.logger.Log("Runing GetAll")
var result bytes.Buffer
for _, url := range urls {
result.WriteString(service.client.Get(url))
}
return result.String()
}
func main() {
service := CreateConcatService()
result := service.GetAll(
"http://example.com",
"https://drewolson.org",
)
println(result)
}
// file container.go
package main
import (
"github.com/google/wire"
)
// CreateConcatService 设置 service 的依赖
// wire 生成 wire_gen.go 的 模板文件
func CreateConcatService() *ConcatService {
panic(wire.Build(
wire.NewSet(wire.Struct(new(Logger))), // struct 使用 wire.Struct 创建
NewHttpClient,
NewConcatService,
))
}
go get github.com/google/wire/cmd/wire wire
执行 wire 解析 container.go ——> wire_gen.go
解析完毕后删除 container.go 文件, 使用 wire_gen.go 中的方法就行
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Programming in Java
Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00
By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!