digwireGodigwire

场景

我们从场景出发。假设我们的项目分层是:

router->controller->service->dao

目录大概就长这样:

现在我们需要对外暴露一个订单服务的接口。

main.go
gin


dig

dig.ContainerByDig()
dig.New()diProvideProvide
server.NewOrderServer
NewOrderServer(xxx)ProvideOrderServerInterfacedao.OrderDao

刚才的代码中,

controller->server->daocontroller<-server<-dao
Provide
digProvide

万事俱备,我们开始注册一个能获取订单的路由,

invoke*controller.OrderHandler
invokehandle *controller.OrderHandlerProvidehandle *controller.OrderHandler

然后对应找到,

server.OrderServerInterface
(order dao.OrderDao)
NewOrderDao
NewOrderDao()OrderDao
NewOrderServer(order dao.OrderDao)
NewOrderServer(order dao.OrderDao)
OrderServerInterface
NewOrderHandler(server server.OrderServerInterface)
*OrderHandler
dig.Invoke(func(handle *controller.OrderHandler) {}

整个链路就通了。上面看的可能不太舒服,用一个图来描述这个过程。


dig

这样会存在什么问题?

Provide

我们在编译项目的时候并不会报任何错误,只会在运行时才发现缺少了依赖项。

 


wire

wireDI
wireProviderInjector
Providerdig
wire.go
dao.NewOrderDaoserver.NewOrderServercontroller.NewOrderHandlerProvider
wire.NewSetorderSet
ProviderSetProvider

这样的好处是:

injectorBuild
injectorProvider
ContainerByWire()injector
wire.goinjectorProvider
wire.gowire
dao.NewOrderDao


wire_gen.go
wire.go//+build wireinjectbuild tagwire.go
wire_gen.go//+build !wireinject
build tagContainerByWire()
injectordig


一切正常。

wirewire.go
build tagpackagebuild tag

还有很多高级的操作可以自行了解。如果有需要完整代码请下方留言。

总结

digwireDIdigwire
wiredig



Reference

[1]https://github.com/google/wire

[2]

https://github.com/uber-go/dig

[3]

https://medium.com/@dche423/master-wire-cn-d57de86caa1b

[4]

https://www.cnblogs.com/li-peng/p/14708132.html




推荐阅读


福利

我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。