Normalde bir veya daha fazla hizmeti başka bir servise enjekte etmem gerektiğinde, her birini açıkça enjekte ederim. Bununla birlikte, servis kabının enjekte edilmesinin gerçekten işleri kolaylaştıracağı bir durum var. Bunun önerilen bir uygulama olmadığını biliyorum, ancak teknik nedenlerin bunu engellemek için ne olduğunu merak ediyorum. Çok yoğun bir kaynak gibi meşru bir şey mi yoksa çok dağınık olduğu için daha kişisel bir duygu mu?Hizmet konteynerini bireysel servisler yerine enjekte etmekten kaçınmanın teknik nedenleri nelerdir?
Hizmet konteynerini bireysel servisler yerine enjekte etmekten kaçınmanın teknik nedenleri nelerdir?
cevap
Konteynırı enjekte ederseniz, bağımlılıkları netleştirmezsiniz. Aslında, onları eskisinden daha fazla engellediniz. Böyle bir sınıfınız varsa, bağımlılıkların neler olduğunu görebilirsiniz. Ayrıca, DocumentCreator'ı ayırdığınızdan ve herhangi bir sınama başarısızlığının kodlarının bir bağımlılık özelliklerinden biri yerine kodun bir sonucu olduğunu bildiğinden emin olmak için, birim sınamaları için bu bağımlılıkları kolayca atabilirsiniz.
Öte yandan, bunu, varsa
...class DocumentCreator(IDependencyContainer container)
{ ... }
... Eğer bağımlılıkları gizlenmiş ettik. Sınıfın iç yapısını incelemeden, bir IFileNamer ve bir İpitorum gerektirdiğini bilemezsiniz.
Ayrıca, DocumentCreator'ı test etmek için kapsayıcıya hangi alayların yerleştirmeniz gerektiğini kolayca öğrenemezsiniz. IDependencyContainer alay etmek size hiç yardımcı olmaz; Sınıfınızın test edilmesinde hala başarısız olmanız gerekir, çünkü sınıfın iç kısımlarını gerekli olduklarını görmek için incelemezseniz, kapsayıcı bir IFileNamer ve bir İpileyici içermeyecektir.
Bu yaklaşımdaki en temel sorun bağımlılıkları açıkça görmemenizdir. Başka bir problem, test etmek daha zor olabilir.
Tanımladığınız şey bir ServiceLocator. Bu modern uygulama tasarımında bir anti-desen olarak kabul edilir. This article nedenini açıklıyor.
Yanlış. İnsanların gerçekten o adamın bloğuna bağlanmayı bırakması gerekiyor. İşte daha yetenekli bir usta ustasından gelen fikir. http://www.martinfowler.com/articles/injection.html – Colin
@Colin Mark Seemann'ın ServiceLocator'a bir anti-pattern bildirme gerekçesini hiç okudunuz mu? Tam bağımlılık enjeksiyonunun avantajlarından sadece birkaçı kazanırsınız, ancak faydaların bir kısmını (yani bağımlılıkların anında görünürlüğünü) özlersiniz. SL eklenmesi, kapsülleme gibi yazılım tasarımının çeşitli kurallarını ihlal ediyor http://blog.ploeh.dk/2015/10/26/service-locator-violates-encapsulation/ veya SOLID http://blog.ploeh.dk/2014/05/15/service-locator-violates-solid/ –
Evet, ve bu saçmalık. Aslında argümanının tersi doğrudur. Örneğin, "kapsülleme ganimeti" der, ama kapsülleme noktasının tamamı, arayanın ilgilenmemesi gereken sınıfın iç detaylarını (örneğin, örnekleminde dışa vurduğu doğrulama gibi) gizlemektir. DI'nin açık uygulamaları ve faydaları vardır, ancak "altın çekiç" değildir; Bu bir anti-desen. TraceListeners içinde Trace.WriteLine() veya Debug.WriteLine() her çağırdığınızda geçirmeniz gerektiğini düşünün! Keşke insanlar, Bay Seeman'a bir uzman gibi davranmayı bırakacaklardı. o sadece bir düşünen blogcu. – Colin
- 1. Symfony: Nesne (hizmet dışı) hizmet yapıcıya enjekte
- 2. Objective-C'deki özellik geçersiz kılma nedenleri nelerdir?
- 3. Bireysel Elementler yerine Sendikasyon İadesi Adları Ekleme?
- 4. Grails: Dinamik alanı sınıfında hizmet enjekte ben alanı özelliğine dayalı bir hizmet enjekte etmek gerek
- 5. JSF2: Spring'ten yönetilen hizmet nesnelerini enjekte edin?
- 6. Bir AutoMapper hedef sınıfına hizmet enjekte
- 7. Yapıcı enjeksiyon herhangi bir hizmet enjekte ederken
- 8. MFC CArray'de, farklı varsayılan şablon türlerini kullanmanın nedenleri nelerdir?
- 9. hata kodu (-11) :: OpenCL'de "cl_build_program_failure" hatası almanın olası nedenleri nelerdir?
- 10. Teknik borcun kaydedilmesinde önemli olan anahtar öğeler nelerdir?
- 11. Web servisler bir döngü içinde
- 12. AngularJS servis atamalarının içinde hizmet alayının enjekte edilmesi
- 13. enjekte Hizmetleri
- 14. Düzgün ES5'te (Javascript) özel birime nasıl özel hizmet enjekte edilir?
- 15. Bir angularjs denetleyici sınaması için bir sahte hizmet enjekte etme
- 16. C# temel yapıcılarla çalışırken tekrar etmekten kaçının
- 17. enjekte SwiftMailer
- 18. $ Enjektör: denetleyicide bir hizmet enjekte ederken unpr angularjs
- 19. Angular2'de özel bir doğrulayıcıda bir hizmet enjekte
- 20. Angular 1.5 bileşeninin templateUrl özelliğine bir hizmet enjekte edilebilir mi?
- 21. cssText veya bireysel stylename?
- 22. Jenkins iş akışı Groovy komut dosyasında komut dosyası onaylarından kaçınmanın bazı teknikleri nelerdir?
- 23. Bir data.frame'i Fiili Parametre Nedenleri İçeren Hata Nedenleri
- 24. React.cloneElement kullanımı nedenleri?
- 25. VectorDrawable nedenleri NumberFormatException
- 26. document.styleSheets yerine dizin yerine?
- 27. IsPostback teknik olarak nasıl çalışır?
- 28. Enjekte edilecek örneğin
- 29. RoboGuice birim test modülünü test modülü yerine enjekte ediyor
- 30. Dagger2 boş yerine enjekte ait her şeyi basitleştirme için nesne
İlk kısımda kesinlikle katılıyorum ve bu yüzden nadir durumlar haricinde özel hizmetler vermeye devam ediyorum. Ama test etmenin nasıl daha zor olacağından emin değilim? –
Bu, kapsayıcı nesnesini oluşturmayı ve bunlara doğrudan enjekte etmek yerine alaylı (veya alay edilmemiş) hizmetleri enjekte etmeyi ima eder, bu da bir adım daha yapar. – greg0ire
Hmm, bu kesinlikle büyük bir dezavantaj. –