使用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?
答案 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
})