2016-06-20 4 views
1

Я пытаюсь обернуть голову вокруг использования Dagger 2 в моем проекте с помощью Retrofit, RxJava, MVP. Тем не менее, я начинаю с малого, читая руководства и смотря видео, и когда я думал, что понял, как это работает, похоже, я этого не делаю. 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 -annotated constructor является альтернативой @Provides -номенданным методом для зависимостей, когда не так много настроек.

С HelloPresenter имеет такой конструктор, Кинжал обнаруживает его автоматически и может вставлять эту зависимость или использовать ее для построения и предоставления других объектов на графике.

Класс с @Inject -написанным конструктором может быть аннотирован аннотацией области (например, @Singleton). В этом случае только компоненты с подходящей областью смогут увидеть это.

В общем случае этот тип зависимостей предоставления данных является менее подробным, но не всегда его можно использовать (например, Activity, SharedPreferences). В таких случаях вы должны пойти с @Module и @Provides.

+0

Хм, я вижу, после прохождения некоторых уроков у меня создалось впечатление, что все места, где происходит инъекция, должны упоминаться в Компоненте, но это относится только к тому, где вы звоните, например, App.getAppComponent (getActivity()). Вставьте (это) в фрагмент, например. Я думаю, что моя проблема заключается в понимании, почему я могу использовать @Inject в классах, которые не находятся в Компоненте, и не делает инъекционную вещь в oncreate. – buddhabath

+1

@buddhabath Может возникнуть некоторая путаница в отношении использования аннотаций @ @ Inject для полей и конструкторов, которые совершенно разные. Когда вы аннотируете * поле * с помощью '@ Inject', вам нужно вызвать' App.getAppComponent (getActivity()). Inject (this) ', чтобы удовлетворить эту зависимость. С другой стороны, когда вы комментируете конструктор, вы говорите кинжалу, что он может использовать этот конструктор, если ему когда-либо понадобится этот класс в своих действиях по созданию графика. Невозможно не вызывать '... inject (this)' в 'Activity', потому что у вас нет доступа к его конструктору и не может предоставить свои поля в качестве параметров конструктора. – AndroidEx

+0

Еще одна замечательная вещь в аннотированных конструкторах '@ Inject' заключается в том, что ее параметры предоставляются автоматически из графика, и вы обычно используете их для заполнения полей вашего класса. В вашем примере 'helloModel' в' HelloPresenter (HelloModel helloModel) 'предоставляется из' обеспеченияHelloModel() 'внутри компонента, поскольку оба этих поставщика зависимостей видны компоненту. – AndroidEx

Смежные вопросы