Recraftory

Dependency Injection

Mengelola dependensi antar komponen aplikasi dengan dependency injection

Apa itu Dependency Injection

  • Pola desain di mana objek menerima dependensinya dari luar
  • Sebaliknya, objek tidak membuat dependensinya sendiri
  • Memudahkan testing dan mengurangi coupling antar komponen

Tanpa Dependency Injection

class UserService {
  constructor() {
    this.repository = new UserRepository();
  }
}
  • UserService terkunci dengan UserRepository
  • Sulit mengganti repository untuk testing
  • Sulit mengubah implementasi database

Dengan Dependency Injection

class UserService {
  constructor(repository) {
    this.repository = repository;
  }
}
  • UserService menerima repository dari luar
  • Bisa inject repository real atau mock
  • Bisa ganti implementasi tanpa mengubah UserService

Jenis Dependency Injection

Constructor Injection

  • Dependensi diberikan melalui constructor
  • Paling umum dan direkomendasikan
  • Objek selalu punya dependensi yang lengkap

Setter Injection

  • Dependensi diberikan melalui setter method
  • Memungkinkan dependensi opsional
  • Bisa mengubah dependensi setelah objek dibuat

Interface Injection

  • Dependensi diberikan melalui interface
  • Lebih formal dan strongly typed
  • Umum di bahasa seperti Java dan C#

Keuntungan Dependency Injection

  • Testing: inject mock untuk unit test tanpa database
  • Loose coupling: komponen tidak bergantung pada implementasi spesifik
  • Reusability: komponen bisa digunakan di konteks berbeda
  • Maintenance: ganti implementasi tanpa mengubah kode consumer

Container DI

  • Framework atau library yang mengelola pembuatan dan injeksi objek
  • Mendaftarkan dependensi dan otomatis menyuntikkan ke komponen
  • Contoh: InversifyJS, TSyringe, NestJS built-in container

Praktik Terbaik

  • Prefer constructor injection untuk dependensi wajib
  • Jangan inject terlalu banyak dependensi, pertimbangkan refaktor
  • Gunakan interface untuk dependensi agar bisa diganti
  • Hindari service locator pattern, gunakan injection langsung
  • Daftarkan dependensi di satu tempat (container atau modul)