Bağımlılık enjeksiyonu yapmanın en iyi yolu hakkında eski, devam etmekte olan bir tartışma var.
İlkbahar kesimi düz bir nesneyi başlattı ve sonra ayarlayıcı yöntemlere rağmen bağımlılıklar enjekte etti.
Ancak daha sonra büyük bir olasılık, yapıcı parametreleri aracılığıyla bağımlılıkların enjekte edilmesinin, bunu yapmanın doğru yolu olduğu konusunda ısrar etti.
Son zamanlarda, yansıma kullanmak daha yaygın hale geldikçe, özel üyelerin değerlerini belirleyiciler veya kurucu argümanları olmadan doğrudan ayarlamak öfke haline geldi.
Böylece ilk kurucunuz bağımlılık enjeksiyonuna ikinci yaklaşımla tutarlıdır. Test için enjeksiyon enjekte etmek gibi güzel şeyler yapmanıza izin verir.
Ancak bağımsız değişken yapıcısının bu sorunu vardır. Uygulama sınıflarını somutlaştırdığı için PaypalCreditCardProcessor
ve DatabaseTransactionLog
PayPal ve Veritabanına zor, derleme zamanı bağımlılığı yaratır. Tüm bağımlılık ağacının doğru bir şekilde oluşturulması ve yapılandırılması sorumluluk alır.
PayPay işlemcisinin gerçekten karmaşık bir alt sistem olduğunu ve ayrıca birçok destek kütüphanesini çektiğini düşünün. Bu uygulama sınıfına derleme zamanı bağımlılığı oluşturarak, tüm bağımlılık ağacına kırılmaz bir bağlantı oluşturursunuz. Nesne grafiğinizin karmaşıklığı az önce, belki iki büyüklükte bir artış gösterdi.
Bağımlılık ağacındaki bu öğelerin birçoğu şeffaf olacak, ancak birçoğunun da somutlaştırılması gerekecek. Oranlar, sadece bir örnek oluşturamayacaksınız PaypalCreditCardProcessor
.
Örneklemeye ek olarak, nesnelerin her biri yapılandırmadan uygulanan özelliklere ihtiyaç duyacaktır.
Yalnızca arayüze bağımlılığınız varsa ve harici bir fabrikanın bağımlılığı oluşturmasına ve enjekte etmesine izin verirseniz, PayPal bağımlılık ağacının tamamını kesersiniz ve kodunuzun karmaşıklığı arayüzde durur.
Yapılandırmada uygulama sınıflarını belirtmek (yani derleme zamanı yerine çalışma zamanında) belirtmek veya çevreye (test, entegrasyon, üretim) göre değişen daha dinamik bağımlılık özelliklerine sahip olmak gibi başka avantajlar da vardır.
Örneğin, PayPal İşlemcinin 3 bağımlı nesnesi olduğunu ve bu bağımlılıkların her birinin iki tane daha olduğunu varsayalım. Ve tüm bu nesnelerin özellikleri yapılandırmadan almak zorunda. Olduğu gibi kod, tüm bunları oluşturma, özelliklerden yapılandırma vb. Vb. Ayarlama sorumluluğunu üstlenir - DI çerçevesinin ilgileneceği tüm endişeler.
İlk başta bir DI çerçevesi kullanarak kendinizi koruduğunuz şey belli olmayabilir, ancak zamanla toplanır ve ağrılı bir şekilde ortaya çıkar. (lol ben zor yoldan yapmaya çalışıyorum deneyimi konuşuyorum)
...
Uygulamada, gerçekten küçük bir program için bile, bir DI tarzında yazıyorum ve sınıfları uygulama / fabrika çiftlerine ayırıyorum. Yani eğer Spring gibi bir DI çerçevesi kullanmıyorsam, basit fabrika sınıflarını bir araya getiriyorum.
Bu, sınıfımın sadece bir şey yapabilmesi için endişelerin ayrılmasını sağlar ve fabrika sınıfı, bir şeyler oluşturma ve yapılandırma sorumluluğunu üstlenir.
Gerekli bir yaklaşım değil, FWIW
...
Daha genel olarak, DI / arayüz modeli iki şey yaparak kodunuzun karmaşıklığını azaltır:
Bunun üzerine, nesne örnekleme ve yapılandırma oldukça tanıdık bir görev olduğundan, DI çerçevesi standart gösterim ve yansıma gibi hileler kullanarak birçok ölçek ekonomisine ulaşabilir. Aynı endişeleri sınıfların etrafına dağıtmak, birinin düşündüğünden çok daha fazla dağınıklığa neden olur.