Sparround

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: @ModuleRepository 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.
  • @Singleton ilə scope-suz binding-in fərqini logla (obyekt hash-lərini çap et).
  • ViewModel üçün FakeRepository yazı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