Vor kurzem habe ich versucht zu verstehen, was der Unterschied zwischen der Verwendung des Service Locator "Anti-Pattern" und der Verwendung des Castle Windsor Containers ist. Ich habe hier und da ein paar Infos im Internet gefunden und habe zusammengefasst, was ich bisher in erfahren habe unfertiger Blogeintrag .
EDIT: Bis jetzt habe ich gedacht, dass Dependency Injection alles ist, was man braucht, um die Trennung zu garantieren. Aber überall sehe ich einen Schub in Richtung Container wie Castle Windsor. Ich möchte die Gründe klar verstehen. Bitte ... Erkläre mir das, als wäre ich 6 Jahre alt :)
Lustig, du solltest darum bitten, dass es erklärt wird, als wärst du sechs Jahre alt; Hier ist eine Erklärung, als wärst du fünf Jahre alt :)
überall sehe ich einen Schub in Richtung Container wie Castle Windsor
Offen gesagt ist der Grund dafür, dass die meisten Leute eigentlich nicht verstehen, was Dependency Injection ist, was bedeutet, dass sie statt des Konzepts von Inversion of Control nach einem Ersatz für das Schlüsselwort new
suchen sie sind schon daran gewöhnt. Dann finden sie einen DI-Container und missbrauchen ihn als Service Locator. Leider ist das sehr einfach.
Dies ist der Grund, warum ich in meinem Buch alle DI-Konzepte erkläre, ohne die Erklärung zu verknüpfen jeden einzelnen DI-Container. Das ist eigentlich die Mehrheit des Buches.
Service Locator und Dependency Injection zwei grundlegend unterschiedliche Versuche, eine lose Kopplung zu erreichen . Service Locator hat viele Nachteile und bietet keine Vorteile, die DI nicht bietet. Aus diesem Grund kann Service Locator sicher als Anti-Pattern bezeichnet werden.
Sie benötigen keinen DI-Container, um DI zu verwenden. in der Tat, würde ich sagen, dass , wenn Sie einen ziemlich anspruchsvollen Ansatz nehmen, ist es wahrscheinlich besser, einen zu vermeiden .
Nun, ein Service Locator kann nur ein Wrapper um eine bestimmte Inversion von Control Container wie Castle Windsor sein. Der einzige Punkt, an dem Ihr Code den Container im Idealfall referenzieren sollte, ist Ihr Kompositionswurzel .
Da die Inversion von Steuercontainern die Abhängigkeitskettung unterstützt, werden bei der Auflösung des Stammtyps aus dem Container alle Abhängigkeiten und alle abhängigen Abhängigkeiten eingefügt.
Wenn Sie dann zur Laufzeit weitere Typen anlegen möchten, können Sie Factories verwenden, die auch einen Verweis auf Ihren Container haben könnten, wenn Sie die Abhängigkeitsverkettung des Containers und die Containerzuordnungen von Interfaces nutzen möchten gegen Implementierungen.
Wenn Sie den Service Locator verwenden, ruft Ihr Code den Locator für Dienste überall auf. Wenn Sie die Inversion der Steuerung verwenden, gibt es nur einen Platz (Kompositionsstamm), an dem Sie den Container aufrufen. Der Rest Ihrer App sollte nicht Container-bewusst sein.
Tags und Links oop inversion-of-control castle-windsor service-locator