Внедрение зависимости с помощью Dagger 2

Я пытаюсь создать библиотеку Android вместе с другим проектом, пока изучаю DI с Dagger 2. Это оказалось сложнее, чем ожидалось.

Мой вопрос

Я пытаюсь использовать одноэлементный класс с именем MySingleton, к которому я хочу получить доступ как из моей библиотеки Android, так и из основного приложения.

Текущая настройка

В основном у меня есть одноэлементный класс с именем MySingleton в моем проекте библиотеки Android. В проекте у меня есть класс SingletonModule, который представляет собой модуль Dagger2, который предоставляет мой синглтон, подобный этому.

@Provides @Singleton
MySingleton providesMySingleton() {
    return new MySingleton();
}

Хорошо, теперь в моем реальном приложении у меня есть следующий компонент.

@Singleton
@Component(modules = {SingletonModule.class})
public interface ApplicationComponent {
    void inject( MyApplication application );
}

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

this.applicationComponent = DaggerApplicationComponent.builder()
            .singletonModule( new SingletonModule() ) // does it for you as empty constructor
            .build();
    applicationComponent.inject(this);

Это здорово, и экземпляр MySingleton, который я вводил по полю, работает нормально.

Что я пробовал

В моем проекте библиотеки Android я создал новый компонент с именем SingletonComponent, который выполнял те же функции, что и ApplicationComponent, только предоставил объект MySingleton. Затем в классе MyService, который расширяет Service, я внедрил по полю объект MySingleton. Это не произвело на меня эффекта. Он действительно возражал против объекта MySingleton, но это был не тот экземпляр, который был создан при внедрении в мое фактическое приложение. Я считаю, что это потому, что я создаю новый компонент ...

Что я здесь делаю не так?

Я просмотрел множество разных сайтов и выполнил множество руководств, но что-то просто не работает с этой инъекцией зависимостей.


person StuStirling    schedule 20.10.2015    source источник


Ответы (1)


Я считаю, что это потому, что я создаю новый компонент ...

Вы абсолютно правы. Синглтоны уникальны для каждого графа зависимостей. При создании второго компонента вы, по сути, создаете второй граф зависимостей, который имеет другой объект для этого синглтона.

Есть два решения:

  1. Создайте в своем приложении только один график, включающий модули библиотеки.
  2. Создайте один график в своей библиотеке, а затем добавьте в него свои модули приложений (например, в: https://github.com/google/dagger/tree/master/examples/android-activity-graphs (они добавляют туда модуль" для каждого действия ", но вы поймете идею ))
person Ognyan    schedule 21.10.2015
comment
Мне нужно иметь возможность вставлять модули в классы в моей библиотеке. Что, если у меня есть компонент, созданный в моей библиотеке (возможно, какой-то синглтон), который я затем передаю в свой компонент приложения, который затем использует этот экземпляр? - person StuStirling; 21.10.2015
comment
Насколько я понимаю, вам понадобится что-то вроде: @Component(dependencies = LibraryComponent.class, modules = MyAppModule.class) для вашего компонента приложения. Таким образом, ваш компонент приложения будет включать компонент lib и сможет использовать его объекты (что в основном является значением варианта 2). - person Ognyan; 21.10.2015
comment
Я собираюсь связать ваш собственный вопрос, который я только что нашел, который помог мне его решить. stackoverflow.com/questions/31354735/ Это именно то, что мне было нужно. - person StuStirling; 21.10.2015