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)