Injeksi Konstruktor memiliki keunggulan yang menjadikan ketergantungan eksplisit dan memaksa klien untuk memberikan contoh. Itu juga dapat menjamin bahwa klien tidak dapat mengubah instance nanti. Satu kelemahan (kemungkinan) adalah Anda harus menambahkan parameter ke konstruktor.
Setter Injection memiliki keunggulan karena tidak perlu menambahkan parameter ke konstruktor. Itu juga tidak mengharuskan klien untuk mengatur instance. Ini berguna untuk dependensi opsional. Ini mungkin juga berguna jika Anda ingin kelas untuk membuat, misalnya, repositori data nyata secara default, dan kemudian dalam tes Anda bisa menggunakan setter untuk menggantinya dengan contoh pengujian.
Antarmuka Injeksi , sejauh yang saya tahu, tidak jauh berbeda dari injeksi setter. Dalam kedua kasus Anda (opsional) menetapkan ketergantungan yang dapat diubah nanti.
Pada akhirnya ini adalah masalah preferensi dan apakah ketergantungan diperlukan atau tidak . Secara pribadi, saya menggunakan injeksi konstruktor hampir secara eksklusif. Saya suka itu membuat dependensi kelas eksplisit dengan memaksa klien untuk memberikan contoh di konstruktor. Saya juga suka bahwa klien tidak dapat mengubah instance setelah fakta.
Sering kali, satu-satunya alasan saya untuk melewati dua implementasi terpisah adalah untuk pengujian. Dalam produksi, saya dapat lulus dalam DataRepository
, tetapi dalam pengujian, saya akan lulus dalam a FakeDataRepository
. Dalam hal ini saya biasanya akan memberikan dua konstruktor: satu tanpa parameter, dan lainnya yang menerima a IDataRepository
. Kemudian, di dalam konstruktor tanpa parameter, saya akan membuat panggilan ke konstruktor kedua dan meneruskan a new DataRepository()
.
Berikut ini contoh dalam C #:
public class Foo
{
private readonly IDataRepository dataRepository;
public Foo() : this(new DataRepository())
{
}
public Foo(IDataRespository dataRepository)
{
this.dataRepository = dataRepository;
}
}
Ini dikenal sebagai Injeksi Ketergantungan Orang Miskin. Saya suka karena dalam kode klien produksi, saya tidak perlu mengulangi diri saya dengan memiliki beberapa pernyataan berulang yang terlihat seperti
var foo = new Foo(new DataRepository());
Namun, saya masih bisa meneruskan implementasi alternatif untuk pengujian. Saya menyadari bahwa dengan DIA Poor Man, saya membuat hardcoding ketergantungan saya, tetapi itu dapat diterima bagi saya karena saya kebanyakan menggunakan DI untuk pengujian.