2016-04-06 24 views
2

Googleのフルーツを使用して作成されたオブジェクトの有効期間はどのくらいですか? 数多くのバインディングを持つ1つの大きなコンポーネントのみを使用するシステムがあります。私が知る限り、いくつかのバインディングは要求時に複数のインスタンスを生成し、他のインスタンスは「シングルトン」です(つまり、1つのインスタンスのみが作成され、複数の要求オブジェクトに渡されます)。 ほとんどのバインディングはすなわち、単純です:Googleフルーツオブジェクトの寿命

.bind<Interface1, Impl1> 

我々はまた、いくつかの工場持っているものの:どのような状況では

.registerFactory<unique_ptr<Interface2>(fruit::Assisted<const string&>)>(
    [](const string& arg) { return Impl2::Create(arg); }) 

を果実は新しいインスタンスを作成し、どのような状況では、既存のインスタンスを再利用するのでしょうか?

この知識は、いくつかのサービスをバインドする方法を決定する上で重要です。なぜなら、バインディングのいくつかがアプリケーション内で「特異」/「シングルトン」であり、要求のたびに作成されることがあるからです。

ボーナスの質問:サブコンポーネントにバインディングの一部を抽出した場合、サブコンポーネントをすべてメインにインストールすると仮定すると、オブジェクトの存続期間にどのように影響しますか?

更新: ここで、スコープはインジェクタによって維持されるはずです。私は次のように別のソリューションを使用しました。 大きなコンポーネントをいくつかの小さなコンポーネントに分割し、それぞれを別々のメソッドで作成しました。これにより、コンポーネントビルディングコードはFruitのサイトの例に似ていました。 はその後、シングルトン値を必要とするコンポーネントのため、私はメソッド内の静的メンバーを入れて、例えば、bindInstanceを使用:

fruit::Component<SingletonInterface> CreateSingletonComponent() 
{ 
    static MySingleton instance; 
    return fruit::createComponent().bindInstance((SingletonInterface&)instance); 
} 

答えて

0

は、私の知る限りは、Googleの果物を知っているようにシングルトンのようなオブジェクトスコープ/有効期間を実装していません。 、RequestScoped、SessionScoped、ThreadScoped。 Googleのフルーツのwikiから

https://github.com/google/fruit/wiki):

インジェクションスコープ、例えば要求の期間だけタイプ/値をバインドします。この機能は実装され、次に削除され、NormalizedComponentの使用によって置き換えられました。共通のバインディングを持つインジェクタを多数作成する必要がある場合、NormalizedComponentではインジェクタの作成に関連する作業の大部分を保存できます(ただし、インジェクタは別個になります)。チュートリアルのサーバーページで、リクエストごとのインジェクタでNormalizedComponentを使用する例を参照してください。

+0

あなたは正しいと思われます。スコープはインジェクタスコープ経由で実装されることを意図しています: "正規化されたコンポーネントは、大多数のバインディングが共通の場合に最適です。典型的な使用例は、リクエストごとに別々のインジェクタが作成されるサーバーです..." – shpuktzy