Doğru, ilk önce, "Yeni bağımlılıklar eklendiğinde ctor'u çağıran herhangi bir kodun güncellenmesi gerekecek"; Açık olmak gerekirse, bağımlılık enjeksiyonu yapıyorsanız ve bağımlılıkları olan bir nesne üzerinde new () yöntemini çağıran herhangi bir kodunuz varsa, bunu yanlış yapıyorsunuz demektir .
DI konteyneriniz ilgili tüm bağımlılıkları enjekte edebilmelidir, bu nedenle yapıcı imzasını değiştirme konusunda endişelenmenize gerek yoktur, böylece argüman gerçekten geçerli olmaz.
Yöntem başına ve sınıf başına enjeksiyon fikrine gelince, yöntem başına enjeksiyon ile ilgili iki önemli sorun vardır.
Bir sorun, sınıfınızın yöntemlerinin bağımlılıkları paylaşması gerektiğidir, çok sayıda bağımlılığa (muhtemelen 4-5'ten fazla) sahip bir sınıf görürseniz, bu sınıf en iyi adaydır. iki sınıfa yeniden düzenleme için.
Bir sonraki sorun, bağımlılıkları, yöntem başına "enjekte etmek" için bunları yöntem çağrısına geçirmeniz gerektiğidir. Bu, yöntem çağrısından önce bağımlılıkları çözmek zorunda kalacağınız anlamına gelir, bu nedenle muhtemelen böyle bir kod grubuyla sonuçlanırsınız:
var someDependency = ServiceLocator.Resolve<ISomeDependency>();
var something = classBeingInjected.DoStuff(someDependency);
Şimdi, bu yöntemi uygulamanızın 10 yerinde arayacağınızı varsayalım: bu snippet'lerden 10 tanesine sahip olacaksınız. Ardından, DoStuff () öğesine başka bir bağımlılık eklemeniz gerektiğini varsayalım: bu snippet'i 10 kez değiştirmeniz gerekecek (veya bir yönteme sarılacaksınız, bu durumda DI davranışını manuel olarak çoğaltıyorsunuz, zaman).
Yani, temelde orada yaptığınız şey, DI kullanan sınıflarınızı kendi DI konteynırlarından haberdar etmenizi sağlar, ki bu temel olarak kötü bir fikirdir , çünkü çok hızlı bir şekilde bakımı zor olan tıknaz bir tasarıma yol açar.
Bunu yapıcı enjeksiyonuyla karşılaştırın; Yapıcı enjeksiyonunda belirli bir DI konteynerine bağlı değilsiniz ve sınıflarınızın bağımlılıklarını yerine getirmekten asla doğrudan sorumlu değilsiniz, bu nedenle bakım oldukça baş ağrısından kaynaklanmıyor.
Bir grup ilgisiz yardımcı yöntem içeren bir sınıfa IoC uygulamaya çalıştığınız gibi geliyor, oysa yardımcı sınıfı kullanıma dayalı olarak bir dizi hizmet sınıfına ayırmaktan, daha sonra çağırır. Bu hala harika bir yaklaşım değil (sadece onlara iletilen argümanlarla uğraşmaktan daha karmaşık bir şey yapan yöntemlerle sınıflandırılmış yardımcı genellikle kötü yazılmış hizmet sınıflarıdır), ancak en azından tasarımınızı biraz daha temiz tutacaktır. .
(Not: Daha önce önerdiğiniz yaklaşımı yaptım ve o zamandan beri tekrarlamadığım çok kötü bir fikirdi. Gerçekten ayrılması gerekmeyen sınıfları ayırmaya çalıştığım ortaya çıktı ve sonuçlandı Her yöntem çağrısının diğer arabirimlerin neredeyse sabit bir seçimini gerektirdiği bir dizi arabirim ile. Bakım yapmak bir kabustu.)