2016-06-20 10 views
1

Retrofit、RxJava、MVP実装で私のプロジェクトでDagger 2を使用することを念頭に置いています。しかし、私はガイドを読んだり、ビデオを見たりして小さいものから始まり、それがどういう仕組みか理解していると思った時、私はそうではないように見えます。 Hereは私が理解しようとしているサンプルです。Dagger2フローの理解(サンプル提供)

モジュール:断片で

@Module 
public class AppModule { 
    private App app; 

    public AppModule(App app) { 
    this.app = app; 
    } 

    @Provides @Singleton public SharedPreferences provideSharedPreferences() { 
    return PreferenceManager.getDefaultSharedPreferences(app); 
    } 

    @Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider, 
     HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) { 
    return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock); 
    } 

    @Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) { 
    return new HelloDiskCache(prefs); 
    } 

    @Provides public HelloService provideHelloService() { 
    return new HelloService(); 
    } 

    @Provides public SchedulerProvider provideSchedulerProvider() { 
    return SchedulerProvider.DEFAULT; 
    } 

    @Provides public Clock provideClock() { 
    return Clock.REAL; 
    } 

    @Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() { 
     return null; 
    } 

コンポーネント

@Component(
    modules = AppModule.class 
) 
@Singleton 
public interface AppComponent { 
    HelloModel getHelloModel(); 
    HelloDiskCache getHelloDiskCache(); 
    MainActivity inject(MainActivity activity); 
    HelloFragment inject(HelloFragment fragment); 
} 

、プレゼンターは(ここから来ている?)注入さ

@Inject HelloPresenter presenter; 

そしてプレゼンターで、ありますコンストラクタインジェクション

@Inject HelloPresenter(HelloModel helloModel) { 
this.model = helloModel; 

}

だから、どのように来る我々はフラグメントでプレゼンターを注入することができ、そしてなぜ私たちはプレゼンターに注入することができますか?答えは非常に精巧である必要はありません私はそれがどこから来ているかを辿ることができないので、私はちょっと感じます。

答えて

1

@Inject - 注釈付きコンストラクタは、多くの設定を行う必要がない場合に、依存関係のための方法に代わるものです。

HelloPresenterにこのようなコンストラクタがあるため、Daggerはこの依存関係を自動的に検出し、この依存関係を挿入したり、グラフ内に他のオブジェクトを作成したり提供したりできます。

注釈付きコンストラクタを持つクラス自体に、スコープ注釈(たとえば、@Singleton)で注釈を付けることができます。この場合、スコープが一致するコンポーネントだけがコンポーネントを見ることができます。

一般に、このタイプの提供の依存関係はそれほど冗長ではありませんが、必ずしもそうではありません(例えば、Activity,)。そのような場合は、@Module@Providesの方法を使用する必要があります。

+0

私は、いくつかのチュートリアルの後に、注入が行われるすべての場所をコンポーネントに記述する必要があるという印象を受けましたが、これはApp.getAppComponent (getActivity())。たとえば、フラグメント内に(this)を挿入します。 コンポーネントにないクラスで@Injectを使用できる理由を理解していると思います。また、oncreateで注入物を実行しません。 – buddhabath

+1

@buddhabathフィールドとコンストラクタに '@ Inject'アノテーションの使用法が混乱することがあります。 *フィールド*に '@Inject'を付けると、この依存関係を満たすために' App.getAppComponent(getActivity()).ins(this) 'を呼び出す必要があります。一方、コンストラクタに注釈を付けると、グラフ作成アクティビティでこのクラスが必要な場合にこのコンストラクタを使用できることをDaggerに伝えます。あなたがそのコンストラクタにアクセスすることができず、そのフィールドをコンストラクタparamsとして提供することができないので、 '... inject(this)'を 'Activity'にコールしない方法はありません。 – AndroidEx

+0

'@ Inject'アノテートされたコンストラクタに関するもう一つの素晴らしい点は、そのパラメータがグラフから自動的に提供され、通常はそれらを使ってクラスフィールドに値を設定することです。この例では、コンポーネント内で 'provideHelloModel()'から 'HelloPresenter(HelloModel helloModel)'の 'helloModel'が提供されています。 – AndroidEx

関連する問題