Tüketicilere genel bir koleksiyon türü sağlayacak bir kitaplık yazıyorum.Bir kütüphane projesinde yapıcı argümanları için varsayılan değerler
Bu kütüphane bağımlılığı enjeksiyon dostu türlerini yapmak istiyorum. Bu, her sınıfın başlatılan nesnenin her bir bağımlılığını belirtmenin mümkün olduğu bir kurucuya sahip olması gerektiği anlamına gelir. Ayrıca kütüphanenin konfigürasyon prensibine göre sözleşmeye bağlı kalmasını istiyorum. Bu, bir tüketici varsayılan davranışı istiyorsa, parametresiz bir kurucu kullanabilir ve nesne bir şekilde bağımlılıkları kendi başına kuracaktır demektir. Örnekte
(C#):
public class Samurai {
private readonly IWeapon _weapon;
// consumers will use this constructor most of the time
public Samurai() {
_weapon = ??? // get an instance of the default weapon somehow
}
// consumers will use this constructor if they want to explicitly
// configure dependencies for this instance
public Samurai(IWeapon weapon) {
_weapon = weapon;
}
}
Benim ilk çözüm hizmeti bulucu desen kullanmak olacaktır.
kod şu şekilde görünecektir:
...
public Samurai() {
_weapon = ServiceLocator.Instance.Get<IWeapon>();
}
...
Gerçi bu bir sorun var. Servis bulucu bir anti-pattern (link) olarak işaretlendi ve bu argümanlarla tamamen katılıyorum. Öte yandan Martin Fowler, servis belirleyici modelinin kullanımını tam olarak bu durumda (kütüphane projeleri) kullanmaktadır (link). Dikkatli olmak istiyorum ve servis belirleyicisinin gerçekten kötü bir fikir olduğunu gösterdikten sonra kütüphaneyi yeniden yazmak için gerekli gerekliliği ortadan kaldırmak istiyorum. Sonuç olarak - bu senaryoda servis belirleyicisinin iyi olduğunu mu düşünüyorsunuz? Problemimi tamamen farklı bir şekilde çözmeli miyim?
public interface IWeaponProvider
{
IWeapon GetWeapon();
}
public class Samurai
{
private readonly IWeapon _weapon;
public Samurai(IWeaponProvider provider)
{
_weapon = provider.GetWeapon();
}
}
Şimdi: Herhangi bir düşünce alternatif yoktur
DI sınıfı bir dostu tutmak önemlidir. +1 –