以下代码段声明了两个Google / Wire初始化程序,它们具有共同的依赖关系。强制仅创建一个配置实例的最佳方法是什么?
我可以将共享依赖项传递给InitializeStorageHandler函数,但是如果我的理解正确的话,那将破坏DI的目的。
当然,我也可以使用Singleton模式。我不确定这是否是做事的“途中”。有最佳实践吗?
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))
}
答案 0 :(得分:1)
当然,我也可以使用Singleton模式
这与wire一致,如issue 77,其中提到“ Wire非常适合提供单身人士”。
如issue 21中所述:
Wire暂时没有子组件的概念。
在与 Dagger 团队进行交谈时,我们发现子组件和作用域引入了相当多的复杂性。正如您所说,通过从创建它们的第一个注入器返回单例,然后将它们传递给以后的注入器,您可以获得与相同的行为。这具有使数据流明确的好处,对于我们提出的示例来说,这似乎是一个净赢。
就是说,我们很好奇看到人们将如何在实际的应用程序中使用Wire:如果这不能扩展,我们可能不得不重新访问。在仔细观察your sample之后,我意识到该组件本身是有状态的(我忘记了Dagger的细节)。我上面的解释在很大程度上仍然适用:我们希望状态是明确的。
在这种情况下,请从How singleton pattern works with Golang中检出“ Jefferson Otoni Lima”:sync.Once
或init()
function可以帮助在“行进”中安全地建立单例。