IOC Konteynerlerinin amacı nedir? Bunun için birleştirilmiş sebepler aşağıdakilerle basitleştirilebilir:
OOP / SOLID Development prensiplerini kullanırken, Bağımlılık Enjeksiyonu dağınık hale gelir. Ya üst seviyedeki giriş noktalarına sahip olmanız, alt seviyelerdeki bağımlılıkları yönetme ve bağımlılıkları inşaat boyunca yinelemeli olarak geçirme ya da fabrika / imalatçı modellerinde ve ihtiyaç duyduğunuzda bağımlılıkları oluşturan arayüzlerde yinelenen bir kodunuz vardır.
Bunu gerçekleştirmek için OOP / SOLID yolu yoktur VE süper güzel kodlara sahiptir.
Bu önceki ifade doğruysa, IOC Containers bunu nasıl yapar? Bildiğim kadarıyla, manuel DI ile yapılamayan bilinmeyen bir teknik kullanmıyorlar. Dolayısıyla tek açıklama, IOC Containers'ın statik nesneleri özel erişim sağlayıcıları kullanarak OOP / SOLID Prensiplerini çiğnemesidir.
IOC Konteynerleri perde arkasında aşağıdaki prensipleri ihlal ediyor mu? Bu iyi bir anlayışa sahip olduğum için asıl soru, ancak başkasının daha iyi bir anlayışa sahip olduğunu hissediyorum:
- Kapsam kontrolü . Kapsam, kod tasarımımda verdiğim hemen hemen her kararın nedeni. Blok, Yerel, Modül, Statik / Global. Kapsam, blok düzeyinde ve olabildiğince az Statik olarak çok açık olmalıdır. Bildirimleri, örneklemeleri ve yaşam döngüsü sonlarını görmelisiniz. Açıkça kullandığım sürece, kapsamı yönetmek için dile ve GC'ye güveniyorum. Araştırmamda, IOC Containers'ın bağımlılıkların çoğunu veya tümünü Statik olarak kurduğunu ve sahnelerin arkasındaki bazı AOP uygulamalarını kontrol ettiğini buldum. Yani hiçbir şey şeffaf değil.
- Kapsülleme . Kapsülleme amacı nedir? Neden özel üye tutmalıyız? Pratik nedenlerden dolayı, API'mızın uygulayıcıları devleti değiştirerek (sahip sınıf tarafından yönetilmesi gereken) durumu değiştirerek uygulamayı bozamazlar. Ancak, güvenlik nedeniyle, üye devletlerimizi ele geçiren ve onaylama ve sınıf kontrolünü atlayan enjeksiyonlar gerçekleşemez. Bu nedenle, özel üyelere dış erişim sağlamak için derleme zamanından önce bir şekilde kod enjekte eden herhangi bir şey (Mocking çerçeveleri veya IOC çerçeveleri) oldukça büyüktür.
- Tek Sorumluluk İlkesi . Yüzeyde, IOC Containers işleri daha temiz hale getiriyor. Ancak, aynı şeyleri yardımcı çerçeveler olmadan nasıl başaracağınızı hayal edin. Bir düzine kadar bağımlılığı olan inşaatçılara sahip olacaksınız. Bu, IOC Containers ile örtülmesi anlamına gelmiyor, bu iyi bir şey! Bu, kodunuzu tekrar değerlendirmek ve SRP'yi takip etmek için bir işarettir.
Kapalı / Açık . Tıpkı SRP'nin Sadece Sınıf olmadığı gibi (Ben, tek başına sorumluluk satırlarına, yöntemleri yalnız bırakarak SRP'yi uygularım). Açık / Kapalı, bir sınıfın kodunu değiştirmemek için sadece yüksek düzeyde bir teori değildir. Programınızın konfigürasyonunu anlama ve neyin değiştirilip neyin uzatılacağı üzerinde kontrol sahibi olma pratiğidir. IOC Containers, sınıflarınızın tamamen çalışma şeklini kısmen değiştirebilir çünkü:
a. Ana kod, bağımlılıkların kapatılmasını belirleme değil, çerçeve yapılandırmasıdır.
b. Kapsam, arayan üyeler tarafından kontrol edilmeyen bir zamanda değiştirilebilir, bunun yerine harici olarak statik bir çerçeve tarafından belirlenir.
Bu yüzden sınıfın yapılandırması gerçekten kapalı değil, üçüncü parti bir aracın yapılandırmasına bağlı olarak kendini değiştiriyor.
Bu sorunun bir nedeni, zorunlu olarak tüm IOC Konteynerlerinin ustası olmamamdır. Ve bir IOC Konteyner fikri güzel olsa da, sadece zayıf uygulamayı kapsayan bir cephe gibi görünüyorlar. Ancak dış Kapsam kontrolü, Özel üye erişimi ve Tembel yükleme işlemini gerçekleştirmek için, önemsiz sorgulanmayacak birçok şeyin devam etmesi gerekiyor. AOP harika, ancak IOC Containers aracılığıyla gerçekleştirilme şekli de sorgulanabilir.
C # 'ya ve .NET GC’ye beklediğim şeyi yapacağına güvenebilirim. Ancak, aynı güveni, el ile yapamadığım şeylere geçici çözümler uygulamak için derlenmiş kodumu değiştiren üçüncü taraf bir araca koyamıyorum.
EG: Entity Framework ve diğer ORM'ler, güçlü Typed nesneler yaratır ve bunları veritabanı varlıklarına eşleştirir, ayrıca CRUD gerçekleştirmek için kazan plakası temel işlevselliği sağlar. Herkes kendi ORM'sini oluşturabilir ve OOP / SOLID İlkelerini manuel olarak takip etmeye devam edebilir. Ancak bu çerçeveler bize yardımcı oluyor, böylece her seferinde tekerleği yeniden icat etmemize gerek kalmıyor. Oysa IOC Konteynerleri, bilerek OOP / SOLID Prensipleri çevresinde çalışmamıza ve bunları korumamıza yardımcı oluyor.
IOC
veExplicitness of code
tam olarak sorunum olan şey. Manüel DI kolayca bir angarya haline gelebilir, ancak en azından kendi kendine yeten açık program akışını tek bir yere koyar - "Gördüğünüzü alırsın, ne alırsın görürsün". IOC konteynerlerinin bağları ve beyanları kolayca kendi başına gizli bir paralel program haline gelebilir.