Co to jest Castle Windsor i dlaczego powinienem się tym przejmować?

191

Jestem wieloletnim programistą Windows, który obciął mnie zębami w systemie Windows 32 i wczesnym COM. Pracuję z .NET od 2001 roku, więc jestem dość biegły w C # i CLR. Nigdy nie słyszałem o Castle Windsor, dopóki nie zacząłem brać udziału w Stack Overflow. Przeczytałem przewodnik „Pierwsze kroki” w Castle Windsor, ale nie można go kliknąć.

Naucz tego starego psa nowych sztuczek i powiedz mi, dlaczego powinienem integrować Castle Windsor z aplikacjami dla przedsiębiorstw.

David Hill
źródło
1
Przeczytaj o odwróceniu kontroli. Jest to bardzo przydatne, aby pomóc ci rozdzielić zależności, które pomogą ci w pisaniu testów jednostkowych, na początek.
Dan Csharpster

Odpowiedzi:

360

Castle Windsor to narzędzie do odwracania kontroli. Są tacy inni.

Może dać ci obiekty ze wstępnie zbudowanymi i okablowanymi zależnościami. Cały wykres obiektu utworzony za pomocą odbicia i konfiguracji zamiast „nowego” operatora.

Zacznij tutaj: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Wyobraź sobie, że masz zajęcia wysyłania wiadomości e-mail. EmailSender. Wyobraź sobie, że masz inną klasę WorkflowStepper. Wewnątrz WorkflowStepper musisz użyć EmailSender.

Zawsze możesz powiedzieć new EmailSender().Send(emailMessage);

ale to - użycie new- tworzy ciasne SPRZĘGŁO, które trudno zmienić. (w końcu to mały wymyślony przykład)

Co więc, jeśli zamiast nowego tego złego chłopca w WorkflowStepper, właśnie przekazałeś go konstruktorowi?

Zatem ktokolwiek to nazwał, musiał założyć EmailSender.

new WorkflowStepper(emailSender).Step()

Wyobraź sobie, że masz setki tych małych klas, które mają tylko jedną odpowiedzialność (google SRP) .. i używasz kilku z nich w WorkflowStepper:

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

Wyobraź sobie, że nie martwisz się szczegółami, EmailSenderkiedy piszesz WorkflowStepperlubAlertRegistry

Martwisz się o problem, z którym pracujesz.

Wyobraź sobie, że cały wykres (drzewo) obiektów i zależności jest łączony w czasie RUN TIME, więc kiedy to zrobisz:

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

dostajesz prawdziwą ofertę na WorkflowStepperwszystkie zależności automatycznie wypełniane tam, gdzie ich potrzebujesz.

Nie ma new

Tak się po prostu dzieje - bo wie, czego potrzebuje.

I możesz pisać mniej defektów dzięki lepiej zaprojektowanemu, DRY kodowi w testowalny i powtarzalny sposób.

Matt Hinze
źródło
30
NIESAMOWITE! Dobrze napisane! TERAZ jestem tym podekscytowany.
David Hill,
1
Dzięki. Jest o wiele więcej. Wybrałem bardzo prosty i boleśnie konkretny przykład. Interfejsów można używać do przełączania implementacji. Możesz automatycznie konfigurować całe zestawy. Możesz określić cykle życia takie jak singleton lub żądanie HTTP itp. Kontynuuj - zmieni to pracę.
Matt Hinze,
6
I aby pomóc ludziom Java: To Guice dla .NET ;-)
Mark Renouf
5
Uważam, że z mojego doświadczenia trudniej jest debugować, ponieważ gdzie są inicjowane obiekty? - W dużym projekcie trudno jest znaleźć źródło inicjalizacji. Wolę staroświecki sposób korzystania new, wiem, gdzie jest wszystko. Nie podoba mi się również pomysł używania odbić i jest to naprawdę czarna skrzynka, kod, którego nie posiadamy, a zatem nie do końca rozumiemy.
Luke T O'Brien
1
@nashwan Tak, piszę test jednostkowy, ale zasady IoC / DI mogą być stosowane bez Castle Windsor lub frameworku strony trzeciej, dla mnie to po prostu dodaje kolejną zależność, to był punkt mojego komentarza. Po prostu nie widzę zalet Castle Windsor.
Luke T O'Brien
4

Mark Seemann napisał doskonałą książkę o DI (Dependency Injection), która jest podzbiorem MKOl. Porównuje także wiele pojemników. Nie mogę wystarczająco polecić tej książki. Książka nazywa się: „Dependency Injection in .Net” https://www.manning.com/books/dependency-injection-in-dot-net

Nieznany
źródło
3

Myślę, że IoC jest krokiem we właściwym kierunku na drodze do większej wydajności i radości zespołu programistów (w tym PM, BA i BO). Pomaga ustalić rozdzielenie problemów między programistami a testowaniem. Daje to spokój podczas projektowania, co pozwala na elastyczność, ponieważ ramy mogą wchodzić i wychodzić.

Najlepszym sposobem na osiągnięcie celu, który stawia sobie za cel IoC (CW lub Ninject itp.), Jest wyeliminowanie polityki nr 1 i nr 2, które eliminują potrzebę tworzenia przez deweloperów fałszywego zrozumienia podczas tworzenia. Czy te dwa rozwiązania nie wydają się powiązane z IoC? Oni są :)

Mike Socha III
źródło
3

Castle Windsor jest Dependency Injection container.Dzięki temu możesz wprowadzić swoje zależności i używać ich bez tworzenia ich za pomocą nowego słowa kluczowego. np. zastanów się, że napisałeś repozytorium lub usługę i chcesz z niego korzystać w wielu miejscach, musisz najpierw zarejestrować swoją usługę / repozytorium i możesz zacząć z niego korzystać po wstrzyknięciu go w wymagane miejsce. Możesz rzucić okiem na poniższy samouczek, który śledziłem, aby nauczyć się zamku windsor.

link .

Mam nadzieję, że ci to pomoże.

Rakesh Burbure
źródło
1

Mówiąc prościej. Wyobraź sobie, że masz w swojej klasie zakopaną klasę, która potrzebuje kilku prostych wartości konfiguracyjnych do wykonania swojej pracy. Oznacza to, że wszystko, co tworzy instancję tej klasy, musi uzyskać te zależności, dlatego zwykle po drodze trzeba przefakturować mnóstwo klas, aby przekazać konfigurację do miejsca, w którym instancja zostanie utworzona.

Tak więc albo wiele klas jest niepotrzebnie zmienianych, grupujesz wartości konfiguracji w jedną dużą klasę konfiguracji, która jest również zła ... lub, co najgorsze, nadal lokalizujesz Service Locator!

IoC pozwala twojej klasie uzyskać wszystkie swoje zależności bez tego kłopotu, i bardziej precyzyjnie zarządza czasem życia instancji.

Andrzej Pasztet
źródło