# Dependency Injection

Dependency Injection (DI) sangat penting terutama untuk mengurangi coupling antar class.

# Studi Kasus

Contoh tanpa DI, terdapat class repository yang memerlukan komponen/class lainnya untuk berfungsi.

class ProductRepository{
    final Connectivity _connectivity;
    final Database _db;
    final ApiClient _client;
    final SharedPreferences _prefs;

    ProductRepository(
        this._connectivity,
        this._db,
        this._client,
        this._prefs,
    );

    ...
}

Misalkan untuk menginisialisasi class ProductRepository kita memerlukan proses pemanggilan seperti berikut:

final connectivity = Connectivity();
final database = Database();
final apiClient = ApiClient();
final prefs = SharedPreferences();

final productRepositoru = ProductRepository(connectivity, database, apiClient, prefs);
...

Oke, mungkin ini masih bisa dihandle. tapi coba bayangkan misalkan class ApiClient mempunyai ketergantungan dengan class lain.


class ApiClient {
    final Dio dio;
    final Http http;
    final Logger logger;

    ApiClient(
        this.dio,
        this.http,
        this.logger
    );

    ...
}

Sehingga untuk memanggil class ProductRepository menjadi seperti ini

final connectivity = Connectivity();
final database = Database();

final dio = Dio();
final http = Http();
final logger = Logger();
final apiClient = ApiClient(dio, http, logger);


final prefs = SharedPreferences();

final productRepository = ProductRepository(connectivity, database, apiClient, prefs);
...

Kode seperti diatas tentunya dapat berjalan seperti biasa, bahkan tanpa error. Tetapi bagaimana jika kita ingin menggunakan class ProductRepository diberbagai class? Apakah harus membuat kumpulan baris kode itu terus-menerus?.

# Flutter DI

Kita sebagai developer harus sebisa mungkin menghindari tight coupling antar komponen/class, disinilah DI WAJIB digunakan. dengan menggunakan DI kita mungkin cukup memanggil class ProductRepository menjadi seperti berikut:

final _productRepository = getIt<ProductRepository>();

Selain kode menjadi lebih rapi, kita juga membuat class yang bersifat tidak tight coupling.

Untuk mempelajari lebih lanjut tentang DI bisa dilihat disini (opens new window) dan disini (opens new window).