← Назад к вопросам

Как в Koin определяется время жизни объекта

2.0 Middle🔥 61 комментариев
#Dependency Injection

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Определение времени жизни объекта в Koin

В Koin время жизни объекта определяется с помощью областей видимости (Scopes) и зависит от способа объявления модуля и привязки зависимостей. Koin предоставляет гибкую систему управления жизненным циклом объектов, которая следует принципам внедрения зависимостей и учитывает архитектурные компоненты Android.

Основные способы определения времени жизни

1. Одиночка (Singleton)

Объект создаётся один раз и существует в течение всего жизненного цикла приложения. Это наиболее долгоживущая привязка.

single { MyRepository() }
// или с явным указанием
single<MyRepository> { MyRepositoryImpl() }

2. Фабрика (Factory)

Новый объект создаётся каждый раз при запросе зависимости. Время жизни объекта соответствует времени жизни зависимого компонента, который его использует.

factory { Presenter(get()) }

3. Scoped (Привязанный к области видимости)

Объект существует в пределах определённой области видимости (Scope), которая имеет свой собственный жизненный цикл. Это ключевой механизм для управления временем жизни в Koin.

Области видимости (Scopes) в Koin

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

Создание области видимости:

// Объявление модуля с областью видимости
val myModule = module {
    scope<MyActivity> {
        scoped { MyViewModel(get()) }
        scoped<MyDataSource> { NetworkDataSource() }
    }
}

Использование области видимости в Android:

class MyActivity : AppCompatActivity() {
    // Создаём или получаем область видимости для активности
    private val activityScope = getKoin().getOrCreateScope("myActivity", named<MyActivity>())
    
    // Получаем зависимость из этой области
    private val viewModel by activityScope.inject<MyViewModel>()
    
    override fun onDestroy() {
        // Важно: закрываем область видимости при уничтожении компонента
        activityScope.close()
        super.onDestroy()
    }
}

Особенности работы с Android

Android-специфичные Scope

Koin предоставляет готовые области видимости для Android-компонентов через модуль koin-android:

// Подключение Android-модуля
val appModule = module {
    // Существует всё время жизни активности
    scope<MainActivity> {
        scoped { ActivityScopedService() }
    }
    
    // Существует всё время жизни фрагмента
    scope<MyFragment> {
        scoped { FragmentScopedHelper() }
    }
}

Автоматическое управление жизненным циклом

С библиотекой koin-android можно использовать автоматическое связывание областей видимости с жизненным циклом компонентов:

class MyViewModel(val repo: Repository) : ViewModel(), KoinScopeComponent {
    override val scope: Scope by activityScope()
    // Объект будет жить пока жива активность
}

Стратегии управления временем жизни

  1. По умолчанию (без Scope):

    • single — живёт пока живёт Koin контейнер (обычно всё время работы приложения)
    • factory — живёт пока на него есть ссылка у потребителя
  2. С пользовательскими Scope:

    • Объекты живут пока существует их область видимости
    • Можно создавать вложенные области видимости
  3. С Android Scope:

    • Привязка к жизненному циклу Activity, Fragment, ViewModel
    • Автоматическое освобождение ресурсов при уничтожении компонента

Практический пример

// Модуль с разными временами жизни
val appModule = module {
    // Singleton - на всё приложение
    single { AppDatabase.getInstance(get()) }
    
    // Factory - новый для каждого запроса
    factory { UserPresenter(get()) }
    
    // Scoped к активности
    scope<MainActivity> {
        scoped { NavigationManager() } // Живёт пока жива активность
    }
    
    // Scoped к фрагменту
    scope<DetailsFragment> {
        scoped<DetailsDataSource> { NetworkDetailsSource() }
    }
}

Важные моменты

  • Закрытие Scope: Критически важно закрывать области видимости при уничтожении компонента во избежание утечек памяти.
  • Иерархия Scope: Можно создавать дочерние области видимости, которые наследуют зависимости родительских.
  • Проверка времени жизни: Используйте getKoin().getScope() для проверки существующих областей.
  • Освобождение ресурсов: Объекты с методами очистки должны реализовывать интерфейс KoinComponent или использовать коллбэки Scope.

Koin предоставляет мощный, но простой в использовании механизм управления временем жизни объектов через систему областей видимости, что особенно полезно в Android-разработке, где важно учитывать жизненные циклы компонентов и предотвращать утечки памяти.

Как в Koin определяется время жизни объекта | PrepBro