使用facebookgo创建多个实例

时间:2018-01-18 03:58:05

标签: go dependency-injection

使用facebookgo图来实例化服务/依赖项的多个实例的正确方法是什么? 文档中的示例显示了实例化与variable之间的紧密耦合。但是,如果我的依赖是“有状态的”,这样我就不能在多个服务中使用单例,那么如何让facebookgo每次都给我新的实例?

func main() {
  var g inject.Graph
  var s service.Impl
  if err := g.Provide(&inject.Object{Value: library.NewDependency()},
    &inject.Object{Value: &s}); err != nil {
    fmt.Println("err in g.Provide: ", err)
  }
  if err := g.Populate(); err != nil {
    fmt.Println("err in g.Populate: ", err)
  }
  s.Feature()

  var s2 service.Impl
}

假设服务和库是一些包含一些实现的包。 “inject”是facebookgo / inject和service.Impl依赖于library.Dependency。现在,我该如何解决s2?

1 个答案:

答案 0 :(得分:0)

如果您将Dargo用于注入服务,则具有作用域。例如Singleton和PerLookup。在您的情况下,您可以在PerLookup范围内绑定服务,然后在每次查找或注入服务时都会创建该服务。

默认情况下,所有内容都绑定到Singleton范围中,因此要使某些内容位于PerLookup范围中,必须在bind语句中明确声明:

import "github.com/jwells131313/dargo/ioc"    

ioc.CreateAndBind(Example2LocatorName, func(binder ioc.Binder) error {
    // binds the echo service into the locator in Singleton scope
    binder.BindWithCreator(EchoServiceName, newEchoService)

    // binds the logger service into the locator in PerLookup scope
    binder.BindWithCreator(LoggerServiceName, newLogger).InScope(ioc.PerLookup)

    return nil
})