Даггер: Что если я * ХОЧУ * каждый раз получаю новый экземпляр? - PullRequest
0 голосов
/ 13 декабря 2018

Интересно, как трудно найти этот ответ.

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

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

Какой лучший способ сделать это?Мне интересно, есть ли способ использовать не @ Singleton / non-scoped провайдера и вызывать какой-то метод create() самостоятельно, или лучше ли самому создать фабрику и сделать эту фабрику экземпляром singleton / scoped ииспользовать мою фабрику, чтобы получить новые экземпляры, когда они мне нужны?[Я должен отметить, что этот класс определенно не будет иметь пустой конструктор, поэтому потребуются внедренные экземпляры других классов, определенных в моем графике внедрения.]

(Кроме того, это, вероятно, поможет наиболее, еслиответы были в контексте Android, то есть я, скажем, в ViewModel и мне нужен новый экземпляр некоторого класса, определенного в одном из моих модулей.)

1 Ответ

0 голосов
/ 13 декабря 2018

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

Чтобы получить новый экземпляр зависимости вручную, вы можете вместо этого ввести Provider и использовать его get() метод, он будет давать вам новый экземпляр каждый раз, когда вы его вызываете.

Часть модуля на самом деле не меняется:

@Module
class AppModule {

    @Provides
    fun provideSomeObject(): SomeObject = SomeObject()
}

А в вашем классе

class SomeClass {
    // We don't inject the object anymore
    // @Inject lateinit var myObject : SomeObject

    // We'll inject it's provider
    @Inject lateinit var myObject : Provider<SomeObject>

    fun someMethod(){
        // Here, instance1 and instance2 are NOT same objects
        val instance1 = myObject.get()
        val instance2 = myObject.get()
    }
}

Вы можете прочитать больше здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...