2015-07-13 3 views
1

У меня есть вопросы относительно кинжала2, который я нахожу трудно понять. Этот код:Кинжал 2 Инъекция конструктора и многое другое

@Module 
public class AppModule { 

    private MainApplication applicationContext; 

    @Inject 
    public AppModule(MainApplication context){ 
     this.applicationContext = context; 
    } 

    @Provides 
    @Singleton 
    StuffA provideStuffA(){ 
     return new StuffA(); 
    } 

    @Provides 
    @Singleton 
    StuffB provideStuffB(StuffA){ 
     return new StuffB(stuffA); 
    } 
} 

А в классе приложения:

appComponent = DaggerAppComponent.builder() 
       .appModule(new AppModule(this)) 
       .build(); 

Мой первый вопрос:

  • Если я хочу разделить модуль на 2, provideStuffA в ModuleA и provideStuffB в ModuleB, как я мог это сделать, учитывая, что B зависит от A.

Второй вопрос:

  • У меня есть объект, который я использую в классе Application, и это из класса приложения, который я называю инъекциями из действий. Итак, как мне получить доступ к этому объекту в классе приложения =? Должен ли я называть приложение на моем приложенииClass сразу после сборки кинжала выше?

Заключительный вопрос

  • Воображение у меня есть два модуля с различными зависимостями, что мне нужно использовать в одной и той же деятельности. Каков правильный способ использования одного компонента и разных модулей, которые будут внедряться в одну и ту же деятельность.

PS. Прошу прощения, если это действительно базовый материал, но я считаю, что документация очень плохая и отсутствие примеров. Благодаря передовой

ответ

1

Ответ 1

Вы просто разделить их на две отдельные модули. Кинжал будет строить график, и когда в какой-то момент provideStuffB() называется, он будет вводить его StuffA. Кстати, я думаю, что есть небольшая ошибка синтаксиса в методе provide, и он должен быть (параметр stuffA отсутствовал):

@Provides 
@Singleton 
StuffB provideStuffB(StuffA stuffA){ 
    return new StuffB(stuffA); 
} 

Ответ 2

Да, это обычный путь. Сразу после создания графика (в onCreate()) вы вводите this (приложение). Обратите внимание, что при использовании этого подхода есть тонкое предостережение, когда приступает к модульным испытаниям - Application объект будет создан еще до того, как будет вызван метод setUp(), так что вы не сможете установить/заменить свой тестовый компонент (и вы в конечном итоге всегда будете иметь свой по умолчанию Компонент). Решение состоит в том, чтобы использовать ленивую инициализацию графика, т. Е. Когда первая активность (или услуга, или BroadcastReceiver и т. Д.) Вызывает getApplication().getInjector(this), вам нужно будет создать график в этой точке.

Ответ 3

Вы, как правило, один топComponent, который содержит все модули и подкомпоненты. Это (должно быть) способно вводить все виды деятельности. Фактически верхний компонент используется для генерации графика.Вот пример из реального приложения:

@Component(modules = {IzgubenoDaggerModule.class, 
         AcraDaggerModule.class, 
         AppInfoDaggerModule.class, 
         SessionDaggerModule.class, 
         ComponentManagerDaggerModule.class, 
         NetworkInfoProviderDaggerModule.class, 
         DeviceInfoProviderDaggerModule.class, 
         KhRestExchangeManagerDaggerModule.class 
        }) 
@Singleton 
public interface IzgubenoDaggerComponent extends GgLibDaggerComponent { 
    void inject(IzgubenoApplication app); 
    void inject(Act_Main act); 
    void inject(Act_ContactDetails act); 
    void inject(Act_MyPets act); 
    void inject(Act_PetEdit act); 
    void inject(Act_PetManage act); 
    void inject(Act_PetPics act); 
    //... 
    GgLibDaggerComponent newGgLibDaggerComponent(HttpsDaggerModule httpsMod, 
              KhRestDaggerModule khrestMod, 
              AppInfoDaggerModule appInfoMod, 
              GgServerDaggerModule ggServMod, 
              GgClientDaggerModule ggClientMod); 
    //... 
} 
Смежные вопросы