Windsor Kalesi nedir ve neden umursamalıyım?


191

Win32 ve erken COM'da dişlerimi kesen uzun zamandır bir Windows geliştiricisiyim. 2001'den beri .NET ile çalışıyorum, bu yüzden C # ve CLR'de oldukça akıcıyım. Stack Overflow'a katılmaya başlayana kadar Windsor Kalesi'ni hiç duymamıştım. Castle Windsor "Başlarken" kılavuzunu okudum, ama tıklamıyor.

Bu eski köpeğe yeni numaralar öğret ve Castle Windsor'u neden kurumsal uygulamalarıma entegre etmem gerektiğini söyle.


1
Kontrolün Ters Çevirilmesi hakkında bilgi edinin. Yeni başlayanlar için birim testleri yazmada size çok yardımcı olacak bağımlılıkları ayırmanıza yardımcı olmak için çok yararlıdır.
Dan Csharpster

Yanıtlar:


360

Castle Windsor, kontrol aracının tersidir. Bunun gibi başkaları da var.

Önceden oluşturulmuş ve önceden bağlanmış bağımlılıkları olan nesneleri size orada verebilir. "Yeni" operatör yerine yansıma ve yapılandırma yoluyla oluşturulan tüm nesne grafiği.

Buradan başlayın: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Bir e-posta gönderme sınıfınız olduğunu düşünün. EmailSender. Başka bir WorkflowStepper sınıfınız olduğunu düşünün. WorkflowStepper içinde EmailSender kullanmanız gerekir.

Her zaman söyleyebilirdin new EmailSender().Send(emailMessage);

ancak bu - kullanımı new- değiştirilmesi zor olan sıkı bir bağlantı oluşturur. (bu her şeyden önce ufak tefek bir örnek)

Peki ya bu kötü çocuğu WorkflowStepper içinde yenmek yerine, onu yapıcıya geçtiyseniz?

O zaman onu kim çağırsa EmailSender'ı yenilemek zorunda kaldı.

new WorkflowStepper(emailSender).Step()

Yalnızca bir sorumluluğu (google SRP) olan yüzlerce sınıfınız olduğunu ve WorkflowStepper'da bunlardan birkaçını kullandığınızı düşünün:

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

Ayrıntıları endişesi değil düşünün EmailSendersiz yazarken WorkflowStepperveyaAlertRegistry

Sadece üzerinde çalıştığınız endişeden endişe ediyorsunuz.

Nesnelerin ve bağımlılıkların tüm grafiğinin (ağaç) ÇALIŞMA SÜRESİ'nde kablolandığını düşünün, böylece bunu yaptığınızda:

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

WorkflowStepperİhtiyacınız olan yerde otomatik olarak doldurulan tüm bağımlılıklar ile gerçek bir anlaşma elde edersiniz .

Yok new

Sadece olur - çünkü neyin neye ihtiyacı olduğunu bilir.

Ve daha iyi tasarlanmış DRY kodu ile test edilebilir ve tekrarlanabilir bir şekilde daha az hata yazabilirsiniz.


30
HARİKA! İyi yazılmış! ŞİMDİ bunun için heyecanlıyım.
David Hill

1
Teşekkürler. Çok daha fazlası var. Çok basit ve acı veren somut bir örnek seçtim. Uygulamaları kapatmak için arayüzleri kullanabilirsiniz. Tüm montajları otomatik olarak yapılandırabilirsiniz. Singleton veya http-request gibi yaşam biçimlerini belirtebilirsiniz. Devam edin - işinizi değiştirecektir.
Matt Hinze

6
Ve Java millet yardımcı olmak için: Bu .NET için Guice ;-)
Mark Renouf

5
Deneyimlerime göre hata ayıklamak daha zor olduğunu düşünüyorum çünkü nesneler nerede başlatıldı ?? - Büyük bir projede, başlatmanın kökünü bulmak zordur. Eski moda kullanım şeklini tercih ederim new, o zaman her şeyin nerede olduğunu biliyorum. Ben de yansımaları kullanma fikrini sevmiyorum ve bu gerçekten bir kara kutu, sahip olmadığımız kod ve bu nedenle tam olarak anlamıyorum.
Luke T O'Brien

1
@nashwan Evet Birim testi yazıyorum, ancak IoC / DI prensipleri Windsor Kalesi veya herhangi bir üçüncü taraf çerçevesi olmadan uygulanabilir, bana sadece başka bir bağımlılık ekliyor, bu benim yorumumdu. Windsor Kalesi'nin avantajlarını görmüyorum.
Luke T O'Brien


3

Sanırım IoC, daha fazla üretkenlik ve geliştirme ekibinin keyfini çıkarmaya giden yolda (PM, BA ve BO'lar dahil) doğru yönde bir adım taşıdır. Geliştiriciler arasında ve test için endişelerin ayrılmasına yardımcı olur. Çerçeveler içeriye girip çıkabildiğinden esnekliğe izin veren mimarlık yaparken içiniz rahat eder.

IoC'nin (CW veya Ninject vb ..) sapladığı hedefi başarmanın en iyi yolu, geliştiricilerin gelişirken yanlış anlama cephesine koyma ihtiyacını ortadan kaldırmaktır. Bu iki çözüm IoC ile ilgili görünmüyor mu? Onlar :)


3

Windsor Kalesi Dependency Injection container., bunun yardımıyla bağımlılıklarınızı enjekte edebilir ve bunları yeni anahtar kelime yardımıyla oluşturmadan kullanabilirsiniz. Örneğin, bir havuz veya hizmet yazdığınızı ve bunu birçok yerde kullanmak istediğinizi düşünün, önce hizmetinizi / havuzunuzu kaydettirmeniz gerekir ve gerekli yere enjekte ettikten sonra kullanmaya başlayabilirsiniz. Castle windsor'u öğrenmek için takip ettiğim aşağıdaki eğiticiye göz atabilirsiniz.

bağlantısını tıklayın .

Umarım size yardımcı olur.


1

Basitçe söyleyin. Kodunuzda, işini yapmak için birkaç basit yapılandırma değerine ihtiyaç duyan bir sınıfınız olduğunu düşünün. Bu, söz konusu sınıfın bir örneğini oluşturan her şeyin bu bağımlılıkları alması gerektiği anlamına gelir, bu nedenle genellikle, örneğin oluşturulduğu yere biraz yapılandırma geçmesi için yol boyunca sınıfların yeniden düzenlenmesi gerekir.

Bu nedenle, ya birçok sınıf gereksiz yere değiştirilir, yapılandırma değerlerini de kötü olan büyük bir yapılandırma sınıfına toplarsınız ... ya da en kötüsü yine de Servis Bulucu'ya gider!

IoC, sınıfınızın tüm açıklıklarını sorunsuz bir şekilde almasına izin verir ve örneklerin yaşamlarını da daha açık bir şekilde yönetir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.