2017-02-10 12 views
1

Итак, что я пытаюсь сделать, это убедиться, что у меня есть только один экземпляр для области в Dagger2.Обеспечение только одного экземпляра для области в Dagger2

По умолчанию Singleton scope уже работает именно так. Независимо от того, сколько мест вы вводите один и тот же объект, давайте назовем его GlobalInstance, метод GlobalInstance provideGlobalInstance(), который построит его, будет называться один раз и только один раз.

С другой стороны, если я определить настраиваемую область, например @SessionScope и внутри некоторого SessionModule Я делаю метод User provideUser(), что метод (и, как следствие, new User() конструктор) будем называть столько раз, сколько я инъекционного User. Независимо от того, я использую один и тот же экземпляр модуля каждый раз, User provideUser() вызывается для каждого @Inject User mUser. У меня есть в моем коде, что приводит к нескольким экземплярам, ​​а не к одному одиночному одиночному ограничению.

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

+0

Вы должны использовать один и тот же компонент, чтобы убедиться, что вы впрыскивать экземпляр, который принадлежит к данному компоненту – EpicPandaForce

+0

Итак, вместо того, сохраняющиеся модуль, я должен упорствовать как-то целая составляющая, не так ли? Какова наилучшая практика для этого? Какой-то статический/глобальный кеш компонентов? – SadClown

+0

Да, обычно да. Я видел «статический» для области приложения @Singleton на уровне приложения и «onRetainCustomNonConfigurationInstance()» для Activity. 'Map ' иначе, где они хранят компонент к некоторому ключу на карте – EpicPandaForce

ответ

1

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

Это означает, что вы могли бы иметь две разновидности @Provides методов в SessionModule:

  • @Provides @SessionsScope - обеспечивает «сессии одиночек» (подробнее об этом позже)
  • @Provides - обеспечивает новый объект на каждой инъекции

Обратите внимание, что термин «singleton» имеет некоторую двусмысленность, когда мы говорим о кинжале, поэтому я предпочитаю использовать термин «объекты с областью». Когда объект с облачным объектом вводится кинжалом в первый раз, компонент кэширует свой экземпляр и возвращает его при каждой последующей инъекции, ВЫПОЛНЯЕМЫЙ ОДНОЙ КОМПОНЕНТОМ.

Для получения дополнительной информации вы можете прочитать этот пост: Android Dagger 2 Scopes Demistified

+0

Я предположил, что пользовательские области не отличаются от предоставленных Singleton, но, как я описал, я У меня другое поведение. Похоже, что проблема заключается в том, что EpicPandaForce объяснила в комментарии - я не должен использовать один и тот же модуль, а скорее весь компонент, если я не хочу, чтобы методы *() вызывались более одного раза для каждой области. – SadClown

+0

@SadClown, пожалуйста, прочитайте сообщение в блоге, на которое я ссылался, - он подробно объясняет эти отношения. В github также есть учебное приложение, в котором показан один из возможных подходов к обработке компонентов. – Vasiliy

+0

Извините, если я выгляжу грубым, но я пошел через почту и не нашел ответа. Но я решил свою проблему, объединив ваш ответ и ответ EpicPandaForce. Благодарю. – SadClown