39 Stimmen

Welches Dependency Injection Tool sollte ich verwenden?

Ich denke über die Verwendung von Microsoft Unity für meine Dependency Injection-Tool in unserem User Interface.

Unsere Mittelstufe verwendet bereits Castle Windsor, aber ich denke, ich sollte bei Microsoft bleiben.

Hat jemand irgendwelche Gedanken darüber, was die beste Dependency Injection-Tool ist?

0 Stimmen

0 Stimmen

ObjectBuilder ist kein DI-Framework. Es ist ein Framework zum Aufbau von DI-Frameworks.

61voto

Xian Punkte 74901

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

Eine schöne und intelligente Argumentation.

15 Stimmen

Interessant ist, dass die akzeptierte Antwort besagt, man solle sich von Unity fernhalten, während die meistgewählte Antwort Unity wählt!

2 Stimmen

Ja, das fand ich auch interessant. Wir haben alle Container gleich behandelt und die Vorurteile gegen MS ignoriert. Jede Situation ist jedoch anders, und man sollte die Lösung wählen, die zu diesem Zeitpunkt für einen selbst die richtige ist. Zufälligerweise haben wir das Rad nicht neu erfunden, sondern unser eigenes geschrieben, das wir bald als Open Source veröffentlichen werden.

12voto

Rinat Abdullin Punkte 22138

Das Festhalten an einem Container ist nicht wirklich wichtig, wenn Ihr System mit Blick auf IoC/DI entwickelt wurde. Mit dem richtigen Ansatz können Sie die IoC-Bibliothek im Laufe der Zeit leicht ändern.

Und natürlich muss der Container ausreichend flexibel sein, um gängige, weit verbreitete Szenarien zu unterstützen (Lebenszyklusmanagement, korrekte Verschachtelung von Containern, XML- und Code-Konfiguration, Abfangen, schnelle Auflösung).

Ich würde empfehlen, zwischen Castle (weit verbreitet und mit vielen Integrationsbibliotheken) und Autofac (leichtgewichtig, schnell und mit richtiger Containerverschachtelung, aber nicht so weit verbreitet) zu wählen.

Es gibt eine umfassende Liste von IoC-Containern von Hanselman

PS: Sie wollen nicht Unity verwenden

14 Stimmen

Können Sie bitte die Bemerkung zur Einheit näher erläutern? Warum ist es eine schlechte Wahl?

0 Stimmen

Nach der Verwendung von ent lib vor windsor - ich habe eine sehr negative und allergische Reaktion auf jeden Versuch von MS, etwas wie ein "policy injector" zu schaffen!! asp.net mvc beiseite :)

0 Stimmen

Das ist kein guter Weg, um zu überzeugen, indem man einfach sagt, man solle etwas nicht verwenden, ohne irgendwelche Kommentare oder Informationen darüber zu geben (10 Jahre späterer Kommentar :)).

12voto

aogan Punkte 2211

Hier ist ein guter Artikel, der .NET IoC Container vergleicht. http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/

0 Stimmen

Wow, dieser Artikel enthält erstaunlich viele Details. Es lohnt sich auf jeden Fall, ihn zu lesen. Es gibt auch einen Teil 2: blog.ashmind.com/index.php/2008/09/08/

5voto

Carl Hörberg Punkte 5843

Ich begann mit Autofac vor einem Jahr und habe seitdem nicht mehr zurückgeblickt.

4voto

user7375 Punkte 602

Ich bin ein Fan von Autofac, aber sowohl Windsor als auch Unity leisten gute Arbeit (obwohl Windsor leistungsfähiger ist als Unity und keine Attributierung des Codes erfordert). Es gibt viele gute, nicht-technische Gründe für die Beibehaltung eines einzigen Containers in einem System.

2 Stimmen

Wie kommen Sie zu der (impliziten) Behauptung, dass Unity von Ihnen verlangt, Ihren Code zu attributieren? Ich benutze es und muss meinen Code überhaupt nicht attribuieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X