Was ist Castle Windsor und warum sollte es mich interessieren?


190

Ich bin ein langjähriger Windows-Entwickler, der mir bei Win32 und Early COM die Zähne geschnitten hat. Ich arbeite seit 2001 mit .NET, daher spreche ich C # und die CLR ziemlich fließend. Ich hatte noch nie von Castle Windsor gehört, bis ich anfing, an Stack Overflow teilzunehmen. Ich habe die Anleitung "Erste Schritte" von Castle Windsor gelesen, aber sie klickt nicht.

Bringen Sie diesem alten Hund neue Tricks bei und sagen Sie mir, warum ich Castle Windsor in meine Unternehmensanwendungen integrieren sollte.


1
Informieren Sie sich über Inversion of Control. Es ist sehr nützlich, um Abhängigkeiten zu entkoppeln, was Ihnen beim Schreiben von Komponententests für den Anfang sehr helfen wird.
Dan Csharpster

Antworten:


358

Castle Windsor ist eine Umkehrung des Steuerungswerkzeugs. Es gibt andere wie es.

Es kann Ihnen Objekte mit vorgefertigten und vorverdrahteten Abhängigkeiten direkt dort geben. Ein gesamtes Objektdiagramm, das über Reflexion und Konfiguration erstellt wurde und nicht über den "neuen" Operator.

Beginnen Sie hier: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Stellen Sie sich vor, Sie haben eine E-Mail-Sendeklasse. EmailSender. Stellen Sie sich vor, Sie haben eine andere Klasse WorkflowStepper. In WorkflowStepper müssen Sie EmailSender verwenden.

Das könnte man immer sagen new EmailSender().Send(emailMessage);

Aber das - die Verwendung von new- schafft eine enge Kupplung, die schwer zu ändern ist. (Dies ist schließlich ein winziges erfundenes Beispiel)

Was ist, wenn Sie diesen bösen Jungen nicht in WorkflowStepper neu geschrieben, sondern nur an den Konstruktor übergeben haben?

Wer auch immer es anrief, musste den EmailSender neu einrichten.

new WorkflowStepper(emailSender).Step()

Stellen Sie sich vor, Sie haben Hunderte dieser kleinen Klassen, die nur eine Verantwortung haben (Google SRP). Sie verwenden einige davon in WorkflowStepper:

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

Stellen EmailSenderSie sich vor, Sie machen sich keine Gedanken über die Details, wenn Sie schreiben WorkflowStepperoderAlertRegistry

Sie sorgen sich nur um die Bedenken, mit denen Sie arbeiten.

Stellen Sie sich vor, dieser gesamte Graph (Baum) von Objekten und Abhängigkeiten wird zur LAUFZEIT verkabelt, sodass Sie Folgendes tun:

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

Sie erhalten ein echtes Geschäft WorkflowSteppermit allen Abhängigkeiten, die automatisch dort ausgefüllt werden, wo Sie sie benötigen.

Es gibt kein new

Es passiert einfach - weil es weiß, was was braucht.

Und Sie können mit besser entworfenem DRY-Code auf fehlerhafte und wiederholbare Weise weniger Fehler schreiben.


30
GENIAL! Gut geschrieben! JETZT bin ich darüber aufgeregt.
David Hill

1
Vielen Dank. Es steckt noch viel mehr dahinter. Ich habe ein sehr einfaches und schmerzlich konkretes Beispiel ausgewählt. Sie können Schnittstellen verwenden, um Implementierungen auszutauschen. Sie können ganze Baugruppen automatisch konfigurieren. Sie können Lebenszyklen wie Singleton oder Per-http-Anfrage usw. angeben. Machen Sie weiter - es wird Ihre Arbeit verändern.
Matt Hinze

6
Und um den Java-Leuten zu helfen: Dies ist Guice für .NET ;-)
Mark Renouf

5
Ich finde, dass es meiner Erfahrung nach schwieriger ist zu debuggen, weil wo die Objekte initialisiert werden? - In einem großen Projekt ist es schwierig, die Wurzel der Initialisierung zu finden. Ich bevorzuge die altmodische Art zu benutzen new, ich weiß, wo dann alles ist. Ich mag auch nicht die Idee, Reflexionen zu verwenden, und es ist wirklich eine Black Box, Code, den wir nicht besitzen und daher nicht vollständig verstehen.
Luke T O'Brien

1
@nashwan Ja, ich schreibe einen Komponententest, aber die Prinzipien von IoC / DI können ohne Castle Windsor oder ein Framework eines Drittanbieters angewendet werden. Für mich fügt es nur eine weitere Abhängigkeit hinzu, das war der Punkt meines Kommentars. Ich sehe die Vorteile von Castle Windsor einfach nicht.
Luke T O'Brien


3

Ich denke, IoC ist ein Sprungbrett in die richtige Richtung auf dem Weg zu mehr Produktivität und Freude am Entwicklungsteam (einschließlich PM, BA und BOs). Es hilft, eine Trennung der Bedenken zwischen Entwicklern und zum Testen herzustellen. Es gibt Ihnen Sicherheit bei der Architektur, was Flexibilität ermöglicht, da Frameworks ein- und ausgehen können.

Der beste Weg, um das Ziel zu erreichen, das IoC (CW oder Ninject usw.) anstrebt, besteht darin, die Politik Nr. 1 und Nr. 2 zu beseitigen, ohne dass Entwickler bei der Entwicklung die Fassade des falschen Verständnisses aufsetzen müssen. Scheinen diese beiden Lösungen nicht mit IoC zu tun zu haben? Sie sind :)


3

Castle Windsor ist Dependency Injection container.Es bedeutet, dass Sie mit dieser Hilfe Ihre Abhängigkeiten einfügen und verwenden können, ohne sie mit Hilfe eines neuen Schlüsselworts zu erstellen. Wenn Sie beispielsweise ein Repository oder einen Dienst geschrieben haben und es an vielen Stellen verwenden möchten, müssen Sie zuerst Ihren Dienst / Ihr Repository registrieren und können es verwenden, nachdem Sie es an der gewünschten Stelle injiziert haben. Sie können sich das folgende Tutorial ansehen, dem ich gefolgt bin, um Castle Windsor zu lernen.

Link .

Hoffe es wird dir helfen.


1

Einfach ausgedrückt. Stellen Sie sich vor, Sie haben eine Klasse in Ihrem Code vergraben, die einige einfache Konfigurationswerte benötigt, um ihre Aufgabe zu erfüllen. Das bedeutet, dass alles, was eine Instanz dieser Klasse erstellt, diese Abhängigkeiten abrufen muss. Daher müssen Sie normalerweise viele Klassen auf dem Weg umgestalten, um nur ein wenig Konfiguration an den Ort zu übergeben, an dem die Instanz erstellt wird.

Entweder werden viele Klassen unnötig geändert, Sie bündeln die Konfigurationswerte in einer großen Konfigurationsklasse, was ebenfalls schlecht ist ... oder im schlimmsten Fall gehen Sie immer noch zum Service Locator!

Mit IoC kann Ihre Klasse alle Abhängigkeiten ohne diesen Aufwand abrufen und die Lebensdauer von Instanzen expliziter verwalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.