google / wire:这是Singleton模式的用例吗?

时间:2019-03-02 21:28:27

标签: go dependency-injection

以下代码段声明了两个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))
}

1 个答案:

答案 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.Onceinit() function可以帮助在“行进”中安全地建立单例。