digwireGodigwire场景
我们从场景出发。假设我们的项目分层是:
router->controller->service->dao目录大概就长这样:
现在我们需要对外暴露一个订单服务的接口。
main.gogindig
dig.ContainerByDig()dig.New()diProvideProvideserver.NewOrderServerNewOrderServer(xxx)ProvideOrderServerInterfacedao.OrderDao刚才的代码中,
controller->server->daocontroller<-server<-daoProvidedigProvide万事俱备,我们开始注册一个能获取订单的路由,
invoke*controller.OrderHandlerinvokehandle *controller.OrderHandlerProvidehandle *controller.OrderHandler然后对应找到,
server.OrderServerInterface(order dao.OrderDao)NewOrderDaoNewOrderDao()OrderDaoNewOrderServer(order dao.OrderDao)NewOrderServer(order dao.OrderDao)OrderServerInterfaceNewOrderHandler(server server.OrderServerInterface)*OrderHandlerdig.Invoke(func(handle *controller.OrderHandler) {}整个链路就通了。上面看的可能不太舒服,用一个图来描述这个过程。
dig这样会存在什么问题?
Provide我们在编译项目的时候并不会报任何错误,只会在运行时才发现缺少了依赖项。
wire
wireDIwireProviderInjectorProviderdigwire.godao.NewOrderDaoserver.NewOrderServercontroller.NewOrderHandlerProviderwire.NewSetorderSetProviderSetProvider这样的好处是:
injectorBuildinjectorProviderContainerByWire()injectorwire.goinjectorProviderwire.gowiredao.NewOrderDaowire_gen.gowire.go//+build wireinjectbuild tagwire.gowire_gen.go//+build !wireinjectbuild tagContainerByWire()injectordig一切正常。
wirewire.gobuild tagpackagebuild tag还有很多高级的操作可以自行了解。如果有需要完整代码请下方留言。
总结
digwireDIdigwirewiredigReference
[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
推荐阅读