この質問は、クラスが挿入されたフレームワークにguiceを使用することの続きであり、初期化する適切な方法は何ですか?、これを実装しようとしましたが、問題を回避するために他の方法も試しましたが、これまでのところ何も機能していません。
主な問題はこれです。APIのさまざまな部分で公開されているとInterfaceA
があります。InterfaceB
これらのインターフェイスの両方を実装する2つのクラスがありTestClass
、RealClass
テストしているのか他のことをしているのかに応じて、次のことができます。
bind(InterfaceA.class).to(TestClass.class);
bind(InterfaceB.class).to(TestClass.class);
または、本番用:
bind(InterfaceA.class).to(RealClass.class);
bind(InterfaceB.class).to(RealClass.class);
これらのクラスを使用するには、次の2つの要件があります。
- およびのすべてのインジェクションにバインドされる、
TestClass
またはの同じインスタンスが必要です。したがって、シングルトンパターンのように、次の点を除きます。RealClass
InterfaceA
InterfaceB
- シングルトンは特定のスコープまたは子インジェクター専用であり、その多くはプログラムの実行中に作成されます。
デフォルトのスコープなしのアプローチでは、インターフェイスインジェクションごとにRealClass
/の複数のインスタンスが作成されます。TestClass
私はそれを望まないので、スコープ、子インジェクター、およびその他の方法でこれを実装しようとしました。何も機能していません:
- 子インジェクターアプローチ:新しいインジェクターを作成し、
TestClass
またはRealClass
をそのインジェクターのシングルトンインスタンスにバインドしようとします。問題は、使用されているか使用されているTestClass
かRealClass
が親インジェクターで構成されているかどうかであり、シングルトンであるため、すでにインスタンス化されています(での場合を除くStage.DEVELOPMENT
)。InterfaceA
たとえば、親インジェクターでにバインドしTestClass
てから、子インジェクターでシングルトンとして再バインドする方法はありません。 - スコープアプローチ:カスタムスコープを作成し、注釈
TestClass
を付けRealClass
ます。次に、このスコープに出入りして、そのスコープ内の単一のインスタンスを取得します。問題は、私のコードがマルチスレッドであり、1つのスレッドからスコープを変更すると、グローバルインジェクターが認識できる内容に影響を与え、他のインスタンスの作成を台無しにすることです。 チャイルドインジェクターとスコープアプローチの組み合わせ。このカスタムスコープを使用するたびに子インジェクターを作成しようとしましたが
RealClass
、親でのバインドが失敗します。No scope is bound to name.package.WhateverScope.
WhateverScope
チャイルドインジェクターだけでなく、いつでも利用できると主張しているようです。
これらの問題はすべて、使用するか親で使用するかを構成できる必要があるが、後で特定のオブジェクトグループに対してシングルトンとしてインスタンス化できるようにする必要があるという事実に起因しているようTestClass
ですRealClass
。私はこれを成し遂げる方法について私の髪を引っ張っています!
ちなみに、Guiceスコープのドキュメントは恐ろしく、ほとんど理解できません。この記事は私をどこにでも連れて行った唯一の記事です: