Dependency Injection: Hilt, Dagger, Koin
Dependency Injection — obyektin öz asılılıqlarını yaratmaması, onların kənardan verilməsidir. ViewModel Repository-ni new-ləmir — konstruktorda alır.
Niyə lazımdır:
- Test — real şəbəkə əvəzinə fake repository ötürmək mümkün olur
- Tək qurulma nöqtəsi — Retrofit/Room kimi obyektlər bir yerdə konfiqurasiya olunur
- Zəif bağlılıq — interfeysə asılılıq, implementasiya dəyişə bilir
Alətlər:
- Dagger 2 — compile-time DI: kod generasiyası, sürətli runtime, çətin öyrənilir.
- Hilt — Dagger-in Android üçün standartlaşdırılmış üzü: hazır komponentlər (
SingletonComponent,ViewModelComponent),@HiltViewModel,@AndroidEntryPoint. Google-un tövsiyəsi. - Koin — service locator üslubu, runtime həlli: sadə DSL, kod generasiyası yoxdur, amma xətalar runtime-da çıxır və böyük qraflarda performans zəifdir.
kotlin
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides @Singleton
fun provideApi(retrofit: Retrofit): AccountApi =
retrofit.create(AccountApi::class.java)
}
class AccountRepositoryImpl @Inject constructor(
private val api: AccountApi,
private val dao: AccountDao
) : AccountRepository { ... }
@HiltViewModel
class AccountViewModel @Inject constructor(
private val repo: AccountRepository
) : ViewModel() { ... }
@AndroidEntryPoint
class AccountsFragment : Fragment() {
private val viewModel: AccountViewModel by viewModels()
}Hilt ilə tipik qraf: module → repository → ViewModel
Scope sualları mütləq gəlir: @Singleton — tətbiq boyu bir instansiya (Retrofit, Room); @ViewModelScoped — ViewModel yaşadıqca; scope-suz binding hər inject-də yeni obyekt verir. Səhv scope real bug-dır: user sessiyası @Singleton olsa, logout-dan sonra köhnə data qala bilər — bank tətbiqində bu, ciddi təhlükəsizlik xətasıdır.
🛠 Tapşırıq
Kiçik Hilt qrafı qur: @Module → Repository interfeysi + implementasiya → @HiltViewModel.
- Bir binding-i qəsdən sil və compile xətasını oxu — Dagger/Hilt-in compile-time üstünlüyünü hiss et.
@Singletonilə scope-suz binding-in fərqini logla (obyekt hash-lərini çap et).- ViewModel üçün
FakeRepositoryyazıb bir unit test keç.
Bitdi sayılır: testdə heç bir Hilt komponenti işə salmadan ViewModel-i qura bilirsənsə.
📚 Mənbələr və sənədlər
- Hilt ilə dependency injectionrəsmideveloper.android.com
- Android-də DI icmalırəsmideveloper.android.com
- Koin sənədlərirəsmiinsert-koin.io