Açıkçası, Bağımlılık Enjeksiyon sadece gerçekten karşı çıkan DEĞİL Bağımlılık enjeksiyon ve bu nedenle herhangi bir bağımlılık yönetim stratejisi - değil Bağımlılık Enjeksiyon.
[İstenmeyen] bağlantı, tam olarak dik bir sorun olmasa da, her iki şekilde de meydana gelebilir veya hafifletilebilir. Bunların ikisi de DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
DependencyClass
bu durumda belirli bir gruba bağlanır . Ama ikisi de bağlandı DependencyClass
. Gerçek kötülük, eğer burada bir tane varsa, mutlaka kaplin değildir, aniden kendi bağımlılıklarına enjekte edilmesi DependencyLookupConstructor
gerekiyorsa değişmesi DependencyClass
gerekir 1 .
Bununla birlikte, bu yapıcı / sınıf daha da gevşek bir şekilde birleştirilmiştir:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Eğer C # çalışıyorsanız, yukarıdaki izin verecektir ServiceLocator
dönmek için herhangi bir şey olduğunda GetMyDoer()
sahip olduğu sürece can, çağrıldığında do()
Ne DependencyLocatingConstructor
o vardır do()
. Tam bir arabirime 2 bağlı olmadan derleme zamanı imza doğrulamasından faydalanırsınız .
Yani, zehirini seç.
Ancak temel olarak, Bağımlılık Enjeksiyonunun somut bir "zıttı" varsa, "Bağımlılık Yönetimi Stratejileri" alanında başka bir şey olurdu. Diğerlerinin yanı sıra, konuşmada aşağıdakilerden herhangi birini kullandıysanız, bunu Bağımlılık Enjeksiyonu DEĞİL olarak kabul ediyorum :
- Servis Konum Belirleyici Deseni
- Bağımlılık Bulucu / Konum
- Doğrudan nesne / bağımlılık yapısı
- Gizli bağımlılık
- "Bağımlılık Enjeksiyonu Değil"
1. İronik olarak, DI'nin daha yüksek seviyelerde çözdüğü bazı problemler, DI'nin daha düşük seviyelerde kullanılmasının bir sonucudur. Gereksiz karmaşıklığı ile codebases çalışan keyfini yaşadım baştan olarak bu karmaşıklığı aslında yardımcı yerlerin avuç ağırlayabilecek bir sonucu ... Ben kuşkusuz kötü maruz bırakılarak önyargılı değilim.
2. Servis konumunun kullanılması, aynı zamanda, bağımlı kodun nasıl oluşturulduğu konusunda büyük ölçüde agnostik olmasına rağmen , aynı türden farklı bağımlılıkları çağrı kodundan işlevsel rolleri ile kolayca belirlemenizi sağlar . Diyelim ki çözmeniz gereken User
ya da IUser
farklı amaçlar için: Örneğin, Locator.GetAdministrator()
karşı Locator.GetAuthor()
- ya da her neyse. Kodum, hangi arayüzleri desteklediğini bile bilmeden işlevsel olarak neye ihtiyaç duyduğunu sorabilir .