Nachdem ich vor kurzem die Verwendung von 6 dieser Geräte ( Windsor , Einigkeit , Spring.Net , Autofac , Ninject , StructureMap ) Ich kann Ihnen einen kurzen Überblick über die einzelnen Angebote, unsere Auswahlkriterien und unsere endgültige Wahl geben.
Hinweis: Wir haben uns PicoContainer.Net nicht angeschaut, da einer unserer Mitarbeiter der Meinung war, dass die .Net-Portierung gegenüber der Java-Version ziemlich schlecht ist. Wir haben uns auch ObjectBuilder nicht angeschaut, da Unity auf ObjectBuilder2 aufbaut und standardmäßig als die bessere Wahl angesehen wurde.
Zunächst einmal kann ich sagen, dass sie sich alle mehr oder weniger stark ähneln und es wirklich darauf ankommt, was für Sie und Ihre spezifischen Anforderungen am besten funktioniert. Unsere Anforderungen waren:
Anforderungen
- Konstruktorbasierte Injektion (wir beabsichtigen no um die Injektion von Eigenschaften, Feldern oder Methoden zu verwenden)
- Programmierbare Konfiguration ( no XML)
- Container-Hierarchien (eine pro Anwendung, pro Anfrage und pro Sitzung, um die Lebenszeit von Komponenten implizit an den Container zu binden)
- Verwaltung der Lebensdauer von Komponenten (für eine genauere Eingrenzung, z. B. transient / singleton)
- Injektion von der Schnittstelle zum Typ oder zur konkreten Instanz (z. B.
ILogger -> typeof(FileLogger)
o ILogger -> new FileLogger()
)
- erweiterte Komponentenerstellung / "Creaton-Event-Mechanismus" für die Vor- und Nachinitialisierung
- korrekte Entsorgung von
IDisposable
Komponenten beim Abriss des Containers
-
gut dokumentiert und/oder Online-Informationen leicht verfügbar
Anmerkung: Obwohl die Leistung eine Anforderung war, wurde sie bei der Auswahl nicht berücksichtigt, da alle untersuchten Container in dieser Hinsicht ähnlich zu sein schienen. Benchmark
Test
Jeder Container wurde in einem typischen Asp.Net-Webforms-Projekt verwendet (da dies unser Zielanwendungstyp war). Wir verwendeten eine einzelne einfache Seite mit einem einzelnen einfachen Benutzersteuerelement, die jeweils von einer Basisseite bzw. einem Basissteuerelement erbten. Wir verwendeten 1 Container auf der BasePage
für einen Container mit dem Geltungsbereich "pro Anfrage" und 1 auf der global.asax für einen Geltungsbereich "Anwendung" und versuchte, sie miteinander zu verketten, damit Abhängigkeiten von beiden Containern aufgelöst werden können.
Jede Webanwendung teilte sich einen konstruierten Satz von Domänenobjekten, die mehrere Ebenen der Abhängigkeit, des Umfangstyps (singleton/transient) und auch von verwalteten und nicht verwalteten Klassen simulierten ( IDisposable
erforderlich). Die "Top-Level"-Abhängigkeitskomponenten wurden manuell aus den Methoden der BasePage
.
Ergebnisse
Windsor - Erfüllt alle Kriterien und verfügt über eine gute Vorgeschichte, eine Blogger-Community und eine Online-Dokumentation. Einfach zu verwenden und wahrscheinlich die erste Wahl. Erweiterte Komponentenerstellung durch die Factory-Funktion. Erlaubt auch die Verkettung von individuell erstellten Containern.
Spring.Net - Ausführliche und wenig hilfreiche Dokumentation und keine offensichtliche / leicht zu programmierende Konfiguration. Unterstützte keine Generika. Nicht gewählt
Ninject - Einfach zu bedienen mit guter, klarer Dokumentation. Leistungsstarke Funktionen, die alle unsere Anforderungen erfüllen, mit Ausnahme von Container-Hierarchien, die leider nicht ausgewählt wurden.
StructureMap - Unzureichend dokumentiert, obwohl es über einen ziemlich fortschrittlichen Funktionssatz verfügte, der alle unsere Anforderungen erfüllte, jedoch gab es keinen eingebauten Mechanismus für Container-Hierarchien, obwohl man ihn mit for-Schleifen zusammenhacken konnte. aquí Die fließende Schnittstelle für Lambda-Ausdrücke schien zunächst etwas zu kompliziert zu sein, konnte aber gekapselt werden.
Unity - Gut dokumentiert, einfach zu bedienen, erfüllt alle unsere Auswahlkriterien und verfügt über einen einfachen Erweiterungsmechanismus, um den von uns benötigten Pre/Post Creation Eventing-Mechanismus hinzuzufügen. Kind-Container mussten aus einem Eltern-Container erstellt werden.
Autofac - Gut dokumentiert und relativ einfach zu benutzen, obwohl die Konfiguration von Lambda-Ausdrücken ein wenig zu kompliziert erscheint, aber auch hier kann man sie leicht wegkapseln. Das Scoping von Komponenten wird durch einen "Tagging"-Mechanismus erreicht, und alle Komponenten werden im Voraus mit einem Builder konfiguriert, was ein wenig umständlich war. Kind-Container wurden von einem Elternteil erstellt und Komponenten von einem "Tag" zugewiesen. Erlaubte generische Injektion.
Schlussfolgerung
Unsere endgültige Wahl war zwischen Windsor und Unity, und dieses Mal haben wir uns für Unity entschieden, weil es so einfach zu bedienen ist, eine gute Dokumentation hat, ein Erweiterungssystem bietet und den Status "Produktion" hat.
0 Stimmen
Verwandte Frage stackoverflow.com/questions/2216684/
0 Stimmen
ObjectBuilder ist kein DI-Framework. Es ist ein Framework zum Aufbau von DI-Frameworks.