Dependency Injection. Hilt
Dependency Injection (DI) - это паттерн проектирования, который используется для уменьшения связанности в приложениях, разбивая их на модули с отдельными ответственностями и инжектируя зависимости между ними. DI упрощает тестирование, повторное использование и обслуживание кода, делая его более гибким и легко настраиваемым.
Hilt - это фреймворк для упрощения внедрения зависимостей (DI) в приложения на платформе Android. Он предоставляет удобные инструменты для создания и управления графом зависимостей в вашем приложении.
Создание разных модулей в Hilt имеет смысл для организации вашего кода и разделения зависимостей на логические группы. Это делает ваш код более структурированным, упрощает его поддержку и повторное использование.
Жизненный цикл модуля в Hilt зависит от контекста, в котором он используется. Он может быть ограничен жизненным циклом приложения, активности, фрагмента или другого Android-компонента, с которым он связан.
@Module
@InstallIn(ApplicationComponent::class) // Компонент, связанный с жизненным циклом приложения
object AppModule {
@Provides
@Singleton // Обозначаем, что этот объект должен быть синглтоном
fun provideSomeDependency(): SomeDependency {
return SomeDependency()
}
}
@Module
@InstallIn(ActivityComponent::class) // Компонент, связанный с жизненным циклом активности
object ActivityModule {
@Provides
fun provideAnotherDependency(): AnotherDependency {
return AnotherDependency()
}
}
@AndroidEntryPoint
class MyActivity : AppCompatActivity() {
@Inject lateinit var someDependency: SomeDependency // Инъекция синглтона
@Inject lateinit var anotherDependency: AnotherDependency // Инъекция зависимости с жизненным циклом активности
// ...
}
ActivityModule
в Hilt работает внутри активности (Activity) и предоставляет зависимости, которые имеют жизненный цикл, ограниченный жизненным циклом этой активности.
Когда активность создается, Hilt автоматически создает компонент, связанный с этой активностью (ActivityComponent
), и начинает использовать модуль, связанный с этим компонентом (ActivityModule
). При этом создаются и предоставляются зависимости, определенные внутри ActivityModule
. Когда активность уничтожается, зависимости, созданные в ActivityModule
, также уничтожаются, освобождая ресурсы и избегая утечек памяти.
Использование ActivityModule
позволяет организовать зависимости, которые имеют более короткий жизненный цикл, чем синглтоны, и связать их с конкретной активностью. Это может быть полезно, если вы хотите, чтобы зависимости уничтожались вместе с активностью, чтобы избежать утечек памяти и эффективно управлять ресурсами.
Однако в случае, если зависимость должна быть доступна в разных активностях или других компонентах приложения, лучше использовать синглтон (например, с помощью SingletonComponent
в Hilt). Это позволит избежать повторного создания зависимости для каждой активности и обеспечит ее единственный экземпляр для всего приложения, что может быть более эффективно с точки зрения использования ресурсов и управления памятью.