Dagger ObjectGraph plus() Модули, которые включают модули в корневой модуль, продолжают возвращать конструктор без аргументов

У меня есть приложение для Android, которое использует Dagger. Есть определенные разделы всего приложения, в которые я хочу добавить ObjectGraphs с областью действия для нескольких действий, имеющих общую область действия. Следующий модуль находится в корне ObjectGraph

@Module(
    injects = {
            MyApplication.class,
    },
    complete = false,
    library = true)
public class BasicContextManagerModule {

    private Context applicationContext;

    public BasicContextManagerModule(Context applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Provides
    Context getApplicationContext() {
        return applicationContext;
    }
}

Затем я пытаюсь добавить следующий модуль через existsObjectGraph.plus(new FileManagerModule());

@Module(
    injects = {
            MyListActivity.class,
            MyFileDetailActivity.class,
            MyFileInfoActivity.class,
    },
    includes = BasicContextManagerModule.class
)
public class FileManagerModule {

    @Provides
    FileManager provideFileManager(Context context) {
        return new FileManager(context);
    }
}

Но результат

java.lang.UnsupportedOperationException: No no-args constructor com.myapp.core.modules.BasicContextManagerModule$$ModuleAdapter

Может кто-нибудь помочь мне понять, почему плюс не позволит этого? Я прочитал из документации кинжала, что плюс расширяет граф объектов, и вы можете включать и добавлять модули. Но мне не удалось этого добиться.


person lazypig    schedule 19.08.2014    source источник


Ответы (1)


includes означает, что модуль будет жить в том же подграфе, и Dagger создаст его экземпляр, если вы не передадите экземпляр.

addsTo означает, что указанный модуль должен быть в графе (фактически в родительском графе), но Dagger не предоставит его вам.

Вам нужно addsTo.

person Thomas Broyer    schedule 19.08.2014
comment
Эй, Томас, я сделал, как вы предложили, и это работает. Но что мне интересно, так это то, что FileManagerModule добавляет к модулю, который предоставляет только контекст, не испортит ли он что-нибудь с обвязками для мест, которым нужен только контекст и не нужен файловый менеджер? - person lazypig; 20.08.2014
comment
Нет. Когда вашему подграфу необходимо внедрить такой объект, он получит контекст из родительского графа (и если объект является одноэлементным, он будет привязан к подграфу, а не к родительскому графу) - person Thomas Broyer; 20.08.2014