2014-02-05 2 views
3

Как объединить модули без конструктора no-args. У меня есть библиотека, содержащая несколько модулей, которые я хочу повторно использовать в своих приложениях. Однако для этих модулей требуются некоторые параметры. Следующий пример описывает мои настройки:Android Dagger - Модули без конструктора no-args

Библиотека:

@Module(
    library = true 
) 
public class LibModule1 { 

    private final String mString; 

    public LibModule1(String string) { 
     mString = string; 
    } 
    //... provide methods 
} 

@Module(
    library = true, 
    addsTo = LibraryModule1.class 
) 
public class LibModule2 { 

    private final String mString; 

    public LibModule2(String string) { 
     mString = string; 
    } 
    //... provide methods 
} 

Обратите внимание, что LibModule2 зависит от некоторых обеспеченных объектов от LibModule1.

Приложение: В моем приложении я вставляю объекты из LibModule1 и LibModule2 в один класс. Но я не знаю, как я могу объединить эти модули. Параметр включает в себя параметр, который не работает, поскольку оба модуля не имеют конструктора no-args. addedTo не работает, потому что мне нужны оба библиотечных модуля, но параметр позволяет мне устанавливать только один класс. Создание двух модулей приложения, вводящих мой класс MyClass.class не работает (класс может быть введен только одним модулем, правильно ?!).

@Module(
    injects = MyClass.class 
) 
public class AppModule { 

} 

Как я могу решить эту проблему?

ответ

4

Вы можете свободно передавать живые экземпляры модулей ObjectGraph.create() и graph.plus(). Если у вас есть с сохранением состояния модулей, вы должны делать такие вещи, как:

ObjectGraph graph = 
    ObjectGraph.create(new LibraryModule1("foo"), LibraryModule2("bar)); 

Тем не менее, если вы создаете экземпляр библиотеки модулей, которые вы описали в своем вопросе так они будут по-прежнему не во время компиляции, так как они, если не включать в себя все другой (или отметьте полный-ложный). Вы можете просто включить LibModule2 в LibModule1, поскольку вы говорите, что у него есть объекты, которые зависят от объектов, предоставленных последним.

@Module(library = true) 
public class LibModule1 { 

    private final String mString; 

    public LibModule1(String string) { 
    mString = string; 
    } 
    //... provide methods 
} 

@Module(includes = LibraryModule1.class) 
public class LibModule2 { 

    private final String mString; 

    public LibModule2(String string) { 
    mString = string; 
    } 
    //... provide methods 
} 

Я рекомендовал бы против полной = ложь в сценарии вы описали в своем вопросе, так что вы не в конечном итоге избежать анализа графика. Вы должны использовать full = false только в том случае, если вы создаете модуль многократного использования, который ожидает, что состояние графика не может напрямую включаться через другой модуль, потому что оно будет объединено с модулем, идентификатор которого неизвестен во время компиляции.

Вы должны делать то, что вы здесь делаете, если планируете использовать LibModule2 в контексте альтернатив LibModule1. В приведенном выше случае нет особых причин не включать LibModule1 из LibModule2.

complete = false модули исключены из всего графического анализа, поскольку они не подтверждают свою полноту. Но оба этих модуля могут быть полными, если дано включение. Но вы должны передавать эти модули в виде экземпляров, потому что у них нет конструкторов no-args.

Вы должны использовать библиотеку = true, чтобы указать, что некоторые из привязок предоставлены для потребления другими зависимостями и не должны быть получены через graph.get (Foo.class) в качестве точек входа в график. По сути, библиотеки = истинные модули исключаются из анализа привязки сирот.

+0

Большое спасибо за подробное разъяснение. Я не нашел отличия от «include» и «addTo» в документации. Пожалуйста, исправьте меня, если я ошибаюсь: «addTo» следует использовать только, если вы вызываете .plus() на другой ObjectGraph. Например. это используется для объекта ObjectGraph с областью действия. Там вы вызываете plus() на Application ObjectGraph. Таким образом, модуль Activity использует «addTo». – vRallev

+0

Да. Мне нужно поднять некоторые документы по этим двум, хотя я надеялся получить аннотации пользовательских областей и затем догнать документы. :/ –

+0

Общая сторона примечания, если мы не ошибаемся в нашем подходе, Dagger 2.0 не нуждается в addTo и будет иметь совершенно другой механизм, который превосходит, но мы немного отстаем от этого. –

-1

Извините, я сделал что-то не так. Теперь это работает.

Отвечая на мой собственный вопрос: вам нужно включить библиотечные модули.

@Module(
    injects = MyClass.class, 
    includes = {LibModule1.class, LibModule2.class} 
) 
public class AppModule { 

} 

В одном модуле я пропускал полный = ложный параметр.

+0

Это не идеальный вариант, хотя это возможно. Вместо того, чтобы пометить LibModule2 как неполную и включить их в третью, вы можете просто включить LibModule1 в LibModule2. Вы должны делать то, что вы здесь делаете, если планируете использовать LibModule2 в контексте альтернатив LibModule1. –

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