2014-02-11 2 views
8

Я использую ПОДХОД предоставить модули для Dagger, описанных в ответ на этот вопрос Android Customize Workflow for Product FlavorsЛучшая инъекция зависимости кинжала на основе типа сборки и аромата?

Наш подход немного отличается - мы Modules в debug типа сборки в src/debug/java и release типа сборки в src/release/java. Наш основной модуль называется ApplicationModule, он включает в себя все остальные.

Modules в src/debug/java предоставляет некоторые пользовательские настройки для отладки, регистрации и т. Д. И переопределяет ApplcationModule.

Теперь у нас есть потребность в пользовательском поведении, основанном на вкусе приложения.

Что было бы правильным подходом к этому?

Например, ароматизаторы от A до C должны обеспечивать индивидуальное поведение, в то время как ароматизаторы от D до F должны обеспечивать базовое поведение по умолчанию.

До сих пор я придумал такие.

  • Все ароматы (не строить типов) имеет тот же класс в src/flavorX/java/com.application.FlavorModule
  • Чтобы избежать дублирования кода только ароматизаторов A до C обеспечить индивидуальное поведение, тогда как другие совершенно пустой, так что проект будет компилировать. И по умолчанию предоставляется мой модуль в src/main/java

Есть ли лучший способ достичь такого результата? Потому что я не люблю пустой src/flavorX/java/com.application.FlavorModule и не нравится дублирования кода ...

ответ

13

Немного сложнее, но вот как я это сделал:

Создание интерфейса MainComponent и держать его в SRC/главная, это должно содержать все, что не вкус специфический

public interface MainComponent { 
    void inject(MyApplication o); 

    void inject(BusinessObject o); 

    Foo getFoo(); 

    Activitycomponent plusActivityComponent(ActivityModule activityModule); 

}

в пределах каждого аромата создать интерфейс, который наследует от указанного

public interface FlavorComponent extends MainComponent { 
//flavor specific injection stuff similar to SourceComponent 
} 

В рамках Debug/Beta/Release создайте фактический компонент и расширьте FlavorComponent (давая вам все тонкости, характерные для вкуса).

@Singleton 
@Component(modules = {ApplicationModule.class, FlavorModule.class, 
     BetaApplicationModule.class, AnotherModuleJustBecause.class}) 
public interface ApplicationComponent extends FlavorComponent { 
    void inject(NYTApplication a); 

} 

Обратите внимание, что вы можете также включать в себя аромат специфический FlavorModule, которые могут отличаться друг от друга в каждом аромате или не включать его в релиз, а в том числе его в бета-версии.

включают также в ComponentFactory внутри Debug/Beta/Release возвращающегося интерфейса компонента общего Flavor

public class ComponentFactory { 

public static final FlavorComponent getComponent(Application context) { 
     return DaggerApplicationComponent.builder() 
       .applicationModule(new ApplicationModule(context)) 
       .build(); 
    } 

и, наконец, от вашего приложения класса вызова:

ComponentFactory.getComponent(this).inject(this); 

Компонент завод возвращает Завершенность Компонент, который расширит компонент Flavor.

+1

Глядя на ваш 'ComponentFactory', я не понимаю, почему ваша последняя строка кода не' ComponentFactory.getComponent (this) .inject (this) '. Могли бы вы объяснить? –

+0

спасибо за нахождение. Сделал коррекцию. – FriendlyMikhail

+0

Это может сделать это более понятным, прочитав статью: https://medium.com/@theMikhail/flavoring-your-dagger-14ab8bcef9f8 –

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