Chr*_*ris 6 dependency-injection go
以下代码段声明了两个具有共同依赖项的 google/wire 初始值设定项。强制只创建一个配置实例的最佳方法是什么?
我可以将共享依赖项传递给 InitializeStorageHandler 函数,但如果我的理解是正确的,这将违背 DI 的目的。
当然,我也可以使用单例模式。我不确定这是否是做事的“Go-Way”。有最佳实践吗?
package api
import (
"../storage"
"../config"
"github.com/google/wire"
)
func InitializeServer() (*Server, error) {
panic(wire.Build(config.NewConfiguration, NewServer))
}
func InitializeStorageHandler() *StorageHandler {
panic(wire.Build(config.NewConfiguration, storage.NewStorage, storage.NewService, NewStorageHandler))
}
Run Code Online (Sandbox Code Playgroud)
当然,我也可以使用单例模式
这与 Wire 一致,如第 77 期中提到的“Wire 很大程度上是为提供单例而设计的”。
正如第 21 期所讨论的:
Wire 目前故意没有子组件的概念。
在与Dagger团队交谈时,我们发现子组件和作用域带来了相当大的复杂性。正如您所说,通过从创建它们的第一个注入器返回单例,然后将它们传递给后面的注入器,您可以获得大致相同的行为。这样做的好处是使数据流变得明确,对于我们提出的示例来说,这似乎是一个净胜。
也就是说,我们非常好奇人们将如何在现实应用程序中使用 Wire:如果这无法扩展,我们可能不得不重新考虑。在更仔细地查看您的示例后,我意识到组件本身是有状态的(我忘记了 Dagger 的细节)。我上面的解释在很大程度上仍然适用:我们希望状态是明确的。
在这种情况下,请查看Jefferson Otoni Lima的“单例模式如何与 Golang 配合使用” :或者该函数可以帮助安全地以“Go-way”方式构建单例。sync.Onceinit()