現在、私はDaggerを使用するためにAndroidのアプリを再設計しています。私のアプリは大きく複雑ですが、最近私は次のシナリオに遭遇しました:コンバーターへの依存性注入にDaggerを使用する
オブジェクトAは、注入のための完璧な候補である特別なDebugLoggerインスタンスを必要とします。ロガーの周りを回るのではなく、Aのコンストラクターを介して注入することができます。これは次のようになります。
class A
{
private DebugLogger logger;
@Inject
public A(DebugLogger logger)
{
this.logger = logger;
}
// Additional methods of A follow, etc.
}
これまでのところ、これは意味があります。しかし、Aは非常に物事のダガーの方法を、以下、Aの複数のインスタンスを構築しなければならない別のクラスBによって構築される必要があり、私は、単純なBにProvider<A>
を注入:
class B
{
private Provider<A> aFactory;
@Inject
public B(Provider<A> aFactory)
{
this.aFactory = aFactory;
}
}
[OK]を、良い今のところ。しかし、突然、Aはその構成に不可欠な「量」という整数などの追加入力が必要です。今、私のAのコンストラクタは次のようになります:
@Inject
public A(DebugLogger logger, int amount)
{
...
}
突然この新しいパラメータが注入を妨げます。さらに、これがうまくいっても、私が間違っていない限り、プロバイダーから新しいインスタンスを取得するときに「量」を渡す方法はありません。私がここでできることはいくつかあり、私の質問はどれが最高ですか?
コンストラクタの後に呼び出されると予想されるsetAmount()
メソッドを追加して、Aをリファクタリングすることができました。しかし、私はAの構築を「量」が埋まるまで遅らせる必要があるので、これは醜いです。私がこのような2つのパラメータ、「量」と「頻度」を持っていたら、2人の設定者がいて、複雑な両方のセッターが呼ばれた再開後にAの建設を確保するためのチェック、または私はそうのように、ミックスにさらに第3の方法を追加する必要があります:
(Somewhere in B):
A inst = aFactory.get();
inst.setAmount(5);
inst.setFrequency(7);
inst.doConstructionThatRequiresAmountAndFrequency();
他の代替は、私は、コンストラクタを使用していないということですベースの注入とフィールドベースの注射と一緒に行く。しかし今、自分のフィールドを公開する必要があります。私のクラスの内部データを他のクラスに明らかにする義務があるので、これは私とうまくはまりません。
はこれまでのところ、私は考えることができる唯一のややエレガントな解決策はそうのように、プロバイダのフィールドベースの注入を使用することです:
class A
{
@Inject
public Provider<DebugLogger> loggerProvider;
private DebugLogger logger;
public A(int amount, int frequency)
{
logger = loggerProvider.get();
// Do fancy things with amount and frequency here
...
}
}
それでも、私は「以来、私は、タイミングがわかりませんよ私のコンストラクタが呼び出される前にDaggerがプロバイダを注入するかどうかはわかりません。
良い方法がありますか? Daggerの仕組みについて何か不足していますか?
ありがとうございました。あなたが記述した工場のパターンは最良のアプローチのようです。ダガーがプライベートフィールドインジェクションをサポートしていれば、私が達成しようとしているものを簡単に許可することができます。それがなぜダガーのオリジナルデザインの一部ではないのだろうか?私はダガーが反射を使って注入すると仮定します。もしそうなら、プライベートフィールドは問題ないでしょうか? – Alex
ダガーは反射に落ちますが、それは注射の主要な手段ではありません。フィールドを直接設定するコードを生成するか、コンストラクタを呼び出します。したがって、ソースツリーの他のコードと同様に動作し、 'private'メンバーにアクセスすることはできません。 –
セキュリティ管理者の中には、クラスのアクセシビリティの変更に依存するリフレクションを中断するものがあります。 –