Dagger способствует развязке зависимостей с собственным графом зависимостей. Нам нужно сказать кинжалу, как классы могут быть сгенерированы, например. он принимает параметр конструктора. После определения он проходит через все зависимости и начинает создавать их с низкого уровня. Если мы не можем ввести какую-либо зависимость в конструктор, например, Модифицируя, мы можем вручную указать кинжалу, как создать экземпляр if с аннотацией @Provides
.
Давайте рассмотрим пример:
Зависимость # 1 - Индивидуальные модули
@Module
class NetworkModule {
@Provides
fun provideRetrofit() : Retrofit
}
Зависимость # 2 - Зависит от Зависимость # 1
class ApiService constructor (@Inject retrofit: Retrofit){
}
Зависимость # 3 - Зависит от Зависимость # 2
class SomeRepository constructor (@Inject apiService: ApiService){
}
Зависимость # 4 - Зависит от Зависимость # 3
class SomeViewModel constructor (@Inject someRepository: SomeRepository) : ViewModel {
}
Dagger сгенерирует все зависимости во время выполнения. Когда вы запустите приложение, каждая зависимость готова и может быть вставлена непосредственно в конструктор. Вам также разрешено вводить любые из этих зависимостей с помощью вставки поля
class MainAcitivty : AppCompatActivity(){
@Inject someRepository: SomeRepository
}
Минусы с вашим текущим подходом:
val someRepository = SomeRepository()
viewModel.init(someRepository)
- Вы будете создавать новый экземпляр
SomeRepository()
снова и снова в разных видах деятельности
- Если
SomeRepository()
имеет какую-либо зависимость, они также будут созданы несколько раз
- Вы делаете крепкую связь. Будет очень сложно протестировать
SomeRepository()
без его зависимостей. В модульном тестировании мы заинтересованы в тестировании модуля, а не его зависимостей.