2017-11-23 3 views
1

私はダガーを学んでいます。私はちょうど興味があります。私は、フィールド注入を持つことになりますクラスをリストDagger2でコンポーネントの本体を空にすることはできますか?

@Singleton 
@Component(modules={AppModule.class, NetModule.class}) 
public interface NetComponent { 
    void inject(MainActivity activity); 
// void inject(MyFragment fragment); 
} 

:私はフィールドインジェクションを使用する場合、私はこのような何かを持っていなければならないことを理解しています。

そして、このコンポーネントは他のコンポーネントの親である場合にも、私のような何かを持っている必要があります。

:私はどちらかのいずれかの操作を実行する予定がない場合でも、私はのようなものを持つことができます

@Component(modules={ServiceModule.class, 
       ContextModule.class, 
       SchedulerModule.class}) 
@Singleton 
public interface SingletonComponent { 
Context appContext(); 
CatTable catTable(); 
CatDao catDao(); 
CatMapper catMapper(); 
CatRepository catRepository(); 
CatService catService(); 
Retrofit retrofit(); 
DatabaseManager databaseManager(); 
@Named("MAIN") Scheduler mainThreadScheduler(); 
@Named("BACKGROUND") Scheduler backgroundThreadScheduler(); 
} 

@Singleton 
@Component(modules = arrayOf(DatabaseModule::class, AppModule::class, 
    ApiServiceModule::class)) 
interface AppComponent{ 

} 

ここで本文は空です。

(おそらくフィールドインジェクションや子コンポーネントが必要なことを知っていますが、何も見つからないと確信しています)

+0

子コンポーネントにサブコンポーネントを使用する場合のみ、空の本文を作成できます。これはコンポーネントの依存関係では機能しません(これはサブコンポーネントとほとんど同じです)。 – EpicPandaForce

答えて

1

完全に空のコンポーネント(別のインターフェイスを拡張しないコンポーネント)は役に立たなくなります。コンポーネントはオブジェクトグラフへのエントリポイントを定義します。したがって、メソッドを一切使用せずに、オブジェクトで行うことはできません。メンバーインジェクションメソッドを列挙しましたが、サブコンポーネントファクトリメソッドとビルダーおよびコンポーネントの提供方法を含めることもできます。

ObjectA getA(); // component provision method 
void inject(B b); // members injection method, which can return void 
C inject(C c);  // ...or return the object it injects, for convenience 

// You can also make a subcomponent getter, if you supply necessary module instances... 
DSubcomponent createD(SomeModule module); 
// or just return a builder. 
ESubcomponent.Builder createEBuilder(); 

ダガーだけで、あなたのコンポーネントのインターフェースからアクセスグラフバインディング用のコードを生成しますので、これは覚えておくことが特に重要です。 の@Bindsまたは@Providesの場合、ObjectGまたはObjectHは、コンポーネントインターフェイスに入力したメソッドから移行することができない限り、Daggerの実装には含まれません。


依存関係のあるコンポーネントとサブコンポーネントはどうなりますか? ParentComponentに依存するChildComponentは、「コンポーネント提供メソッド」(ゼロ引数のゲッター)で使用できるオブジェクトにのみアクセスできるため、メソッドのないコンポーネントは依然として使用できません。また、(注釈のない)インタフェースを提供し、ParentComponent(または他の実装)をビルダーに渡すこともできます。いずれの場合でも、利用可能なオブジェクトは、親コンポーネントのパブリック・インタフェースにリストされているオブジェクトであり、インタフェースが空でないことを依然として排除します。

サブコンポーネントは、依存関係のあるコンポーネントと異なり、その親と同時にコードを生成します。つまり、親から継承されていることを明示的に指定する必要はありません。 Daggerは、親グラフで利用できるものを推測できます。ただし、親コンポーネントの一部として、サブコンポーネントも親コンポーネントのインターフェイスからの参照が必要です。そうでない場合は、生成されません。 (この参照は、サブコンポーネントを返すファクトリメソッド、サブコンポーネントのBuilderを返すメソッド、またはコンポーネントの他のオブジェクトやメンバからの推移的な注入です)。したがって、サブコンポーネントの場合でも、空のコンポーネントはまだ存在します役に立たない。

関連する問題