Yapıcı Enjeksiyonu , bağımlılığı açık hale getirme ve istemciyi bir örnek vermeye zorlama avantajına sahiptir. Ayrıca, istemcinin örneği daha sonra değiştiremeyeceğini de garanti edebilir. Bir (olası) dezavantaj, kurucunuza bir parametre eklemeniz gerektiğidir.
Setter Injection , yapıcıya bir parametre eklenmesini gerektirmemesi avantajına sahiptir. Ayrıca istemcinin örneği ayarlamasını da gerektirmez. Bu isteğe bağlı bağımlılıklar için kullanışlıdır. Bu, sınıfın örneğin varsayılan olarak gerçek bir veri havuzu oluşturmasını istiyorsanız da yararlı olabilir ve daha sonra bir testte ayarlayıcıyı test örneğiyle değiştirmek için kullanabilirsiniz.
Arayüz Enjeksiyonu , anlayabildiğim kadarıyla, ayarlayıcı enjeksiyonundan çok farklı değil. Her iki durumda da (isteğe bağlı olarak) daha sonra değiştirilebilecek bir bağımlılık ayarlarsınız.
Sonuçta bu bir tercih meselesi ve bağımlılığın gerekli olup olmadığıdır . Şahsen, neredeyse tamamen yapıcı enjeksiyon kullanıyorum. İstemciyi yapıcıda bir örnek sağlamaya zorlayarak bir sınıfın bağımlılıklarını açık hale getirir. Ben de müşteri gerçeği sonra örneği değiştiremezsiniz gibi.
Çoğu zaman, iki ayrı uygulamaya geçmemin tek nedeni test etmektir. Üretimde, ben geçebilirim DataRepository
, ama testte, ben bir FakeDataRepository
. Bu durumda genellikle iki kurucu sağlayacağım: biri parametresiz, diğeri ise a IDataRepository
. Sonra, parametresiz kurucuda, ikinci kurucuya bir çağrıyı zincirleyeceğim ve a new DataRepository()
.
İşte C # 'da bir örnek:
public class Foo
{
private readonly IDataRepository dataRepository;
public Foo() : this(new DataRepository())
{
}
public Foo(IDataRespository dataRepository)
{
this.dataRepository = dataRepository;
}
}
Buna Zavallı Adamın Bağımlılık Enjeksiyonu denir. Seviyorum çünkü üretim istemcisi kodunda, kendime benzeyen birkaç tekrarlanan ifade alarak kendimi tekrar etmeme gerek yok
var foo = new Foo(new DataRepository());
Ancak, yine de test için alternatif bir uygulama geçirebilirim. Poor Man's DI ile bağımlılığımı zor kodladığımı fark ettim, ancak test için çoğunlukla DI kullandığım için bu benim için kabul edilebilir.