使用谷歌水果创建的对象的生命周期是多少? 我们的系统只使用一个带有几十个绑定的大型组件。据我所知,一些绑定在请求时会产生多个实例,而其他绑定则是“单例”(即只创建一个实例并传递给多个请求对象)。 大多数绑定都很简单,即:
.bind<Interface1, Impl1>
虽然我们也有几家工厂:
.registerFactory<unique_ptr<Interface2>(fruit::Assisted<const string&>)>(
[](const string& arg) { return Impl2::Create(arg); })
在什么情况下,水果会创建一个新实例,在什么情况下它会重用现有实例?
这一知识对于决定如何绑定某些服务非常重要,因为我们要确保某些绑定在应用程序中是“单数”/“单例”,并且每次绑定都是在请求时创建的。
奖金问题:如果我们提取一些子组件的绑定,假设我们.install()将所有子组件放入主组件中,那将如何影响对象的生命周期?
更新 所以我们现在知道范围应该由注射器维持。我最终使用了不同的解决方案,如下所示: 我将大型组件拆分为少数几个较小的组件,每个组件都在一个单独的方法中创建。这使得组件构建代码看起来更像Fruit的站点中的示例。 然后,对于需要单例值的组件,我在方法中放置一个静态成员并使用bindInstance,例如:
fruit::Component<SingletonInterface> CreateSingletonComponent()
{
static MySingleton instance;
return fruit::createComponent().bindInstance((SingletonInterface&)instance);
}
答案 0 :(得分:0)
据我所知,Google Fruit不会像Singleton,RequestScoped,SessionScoped,ThreadScoped那样实现对象范围/生命周期。
来自Google Fruit wiki(https://github.com/google/fruit/wiki):
注射范围,例如仅在请求的持续时间内绑定类型/值。此功能已实现,然后删除,替换为使用NormalizedComponent。如果您需要创建许多具有大多数共同绑定的注入器,NormalizedComponent允许保存注入器创建中涉及的大部分工作(但仍然会有单独的注入器)。有关使用每个请求注入器的NormalizedComponent的示例,请参阅教程中的服务器页面。