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