Подтвердить что ты не робот

Самый простой способ создать синглтон с кинжалом 2?

Нужно ли мне настраивать модули, провайдеры и интерфейсы (компоненты)? Похоже, что немного накладных расходов просто для того, чтобы вводить однотонный сигнал.

Может ли кто-нибудь предоставить простой пример синглтона с помощью кинжала 2? (также показать, как можно установить свойства singleton, такие как контекст, поэтому вам не нужно передавать его каждый раз, когда вы используете singleton)

4b9b3361

Ответ 1

Модули нужны только для вещей, которые вы не можете аннотировать с @Inject конструктора @Inject (потому что, например, инфраструктура создает его для вас - как контекст). Если вы не можете добавить конструктор @Inject, вам также необходимо указать метод void inject(...) в компоненте.

Однако, если вы можете создать его с помощью конструктора @Inject, то @Inject работает как аннотация поля

@Component(modules={ContextModule.class})
@Singleton
public interface SingletonComponent {
    void inject(MainActivity mainActivity);
}

@Module
public class ContextModule {
    Context context;

    public ContextModule(Context context) {
        this.context = context;
    }

    @Provides
    Context context() {
        return context;
    }
}

@Singleton
public class MyOtherSingleton {
    @Inject
    public MyOtherSingleton() {
    }
}


@Singleton
public class MySingleton {
    @Inject Context context;
    @Inject MyOtherSingleton myOtherSingleton;

    @Inject
    public MySingleton() {
    }
}

Вы также можете сделать параметры конструктора

private final Context context;
private final MyOtherSingleton myOtherSingleton;

@Inject
public MySingleton(Context context, MyOtherSingleton myOtherSingleton) {
    this.context = context;
    this.myOtherSingleton = myOtherSingleton;
}

@Inject
MySingleton mySingleton;

//...

    SingletonComponent singletonComponent = DaggerSingletonComponent.builder()
                                           .contextModule(new ContextModule(this.getApplicationContext()))
                                           .build();
    singletonComponent.inject(this);

Проверено на работу:

08-23 04:39:28.418 com.zhuinden.rxrealm D/DogView: My singleton has [[email protected]] and [c[email protected]5336bb74]
08-23 04:39:36.422 com.zhuinden.rxrealm D/CatView: My singleton has [[email protected]] and [c[email protected]5336bb74]

Ответ 2

Это упрощенный (не совсем точный - проверьте ссылки ниже) текст, постепенно объясняющий Dagger2 и идею, стоящую за ней. Мои надежды заключаются в том, что после этого текста вы сможете прочитать и понять другие подробности о Dagger2.

Не сосредотачивайтесь на терминах singleton. Dagger2 (забыть кинжал и использовать кинжал2) существует для обеспечения возможности использования объекта. Не та область, о которой мы обычно говорим (классы, методы, циклы), но область на архитектурном уровне (вы определяете эти слои).

Некоторые типичные уровни в Android - это приложение, активность и фрагмент. Как вы знаете, ваше приложение для Android имеет только один экземпляр класса Application. Множество экземпляров класса Activity и многих экземпляров класса Fragment.

Вы хотите, чтобы ваше приложение было красивым и чистым, и вы хотите сохранить свои объекты в том месте, где они находятся (применять семантику). Эти объекты должны быть созданы где-то (обычно вам нужно набирать factory classes/methods/projects --last one a a joke), что утилиту создания нужно вызывать где-то, и вам нужно передать эти объекты откуда-то туда, где они принадлежат!

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

Кинжал2 на помощь! В основном есть два условия, которые вам нужно понять. Компоненты и модули.

Компоненты здесь для ввода. Они вводят ваши классы объектами, которые им нужно построить. Компоненты только вводят, они не создают объекты. Итак, кто создает объекты?

Модули создают объекты, которые Компоненты вводят в классы, которые необходимо построить. Модули полны методов enableInsertName. Эти методы создают объекты, которые необходимо передать классам, которые в них нуждаются. Метод предоставления всегда будет создавать новый объект или он будет повторно использовать (singleton) уже созданный объект, если этот метод предоставления аннотируется с помощью @Scope (вам нужно будет ввести новую аннотацию области, но эту деталь). Названия методов предоставления не имеют большого значения. Важно то, что возвращаемый тип этих методов (просто помните, что информация будет полезна позже).

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

Активируйте свой компонент (Dagger2 генерирует классы конструктора для ваших Компонентов) в слое, который вы чувствуете, что компонент должен вводить. Например, вы создаете экземпляр ApplicationComponent внутри класса Application. Объекты, внедренные ApplicationComponent, создаются только один раз, и они существуют, пока экземпляр ApplicationComponent существует (во время инъекции они будут извлечены, а не воссозданы). Экземпляр ApplicationComponent существует, пока существует экземпляр Application (поэтому в среде Android, которая в основном всегда/в течение жизни приложения).

Вы можете повторить ту же историю с классами Activity. Выполните активацию ActivityComponent внутри вашего класса Activity, этот компонент существует, пока эта активность существует. Обратите внимание, что объекты, инъецированные ActivityComponent, существуют только в том случае, когда существует ActivityComponent (экземпляр класса Activity). Это красота Даггера2. Объекты, относящиеся к уровням активности, буквально привязаны к уровню активности.

Примечание. Компоненты могут зависеть друг от друга. Ваш ActivityComponent может зависеть от вашего ApplicationComponent, поэтому уровень активности может использовать объекты с уровня приложения (но не наоборот, этот плохой дизайн). Таким образом, компоненты формируют дерево зависимостей, которое делает выборку и инъекцию объектов очень эффективными.

Прочитав это (мои поздравления с хорошим сэр), я рекомендую проверить эту ссылку и проверить Джейк Уортон поговорит о Dagger2.