Frage

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

Unser Middle Tier bereits verwendet Schloss Windsor, aber ich denke ich mit Microsoft bleiben soll.

Hat jemand irgendwelche Gedanken über das, was das beste Dependency Injection-Tool?

War es hilfreich?

Lösung

zu einem Behälter Des Festhalten ist nicht wirklich wichtig, wenn Ihr System mit dem IoC / DI konzipiert worden. Mit dem richtigen Ansatz können Sie bequem die IoC Bibliothek ändern die Straße hinunter.

Und natürlich, der Behälter genügend Flexibilität bieten gemeinsame weit verbreitete Szenarien (Lifecycle Management, geeignete Behälter Verschachtelung, XML und Code-Konfiguration, Abfangen, schnelle Auflösung) zu unterstützen.

Ich würde empfehlen, zwischen Schloss (weit verbreitet und viele Integration Bibliotheken) zu holen und Autofac (leicht, schnell und hat richtigen Behälter nisten, aber ist das nicht weit verbreitet)

Es gibt eine umfassende Liste von IoC Container von Hanselman

PS: Sie wollen nicht Unity verwenden

Andere Tipps

Nachdem die Verwendung von 6 dieser kürzlich gespickt ( Windsor , Einheit , Spring.Net Autofac , Ninject , StructureMap ) ich eine schnelle anbieten Zusammenfassung der einzelnen, unsere Auswahlkriterien und unsere endgültige Wahl.

Hinweis: wir haben nicht auf PicoContainer.Net aussehen, als eines unseres Team den .Net-Port als ziemlich schlecht zu sein von der Java-Version. Wir sahen auch nicht ObjectBuilder, als Einheit auf der ObjectBuilder2 gebaut und galt als eine bessere Wahl standardmäßig sein.

Zum einen kann ich sagen, dass mehr oder weniger alle von ihnen alle ziemlich ähnlich sind und es kommt wirklich darauf an, was wirklich am besten für Sie und Ihre spezifischen Anforderungen. Unsere Anforderungen enthalten:

Anforderungen

  • Constructor basierte Injektion (wir beabsichtigen nicht verwenden Eigenschaft, Feld oder eine Methode Injektion)
  • Programmierbare Konfiguration ( nicht XML)
  • Container Hierarchien (eine pro Anwendung pro Anfrage und pro Sitzung mehr implizit Komponente Lebensdauer Umfang Behälter binden)
  • Lebensdauer der Komponenten-Management (für mehr granularen Scoping zB transienter / Singleton)
  • Injektion von Schnittstelle oder konkrete Instanz (zB ILogger -> typeof(FileLogger) oder ILogger -> new FileLogger())
  • eingeben
  • erweiterte Komponentenerstellung / "CREATON Event-Mechanismus" für Pre / Post-Initialisierung
  • die korrekte Entsorgung von IDisposable Komponenten auf Behälter abreißen
  • gut dokumentiert und / oder Online-Informationen leicht verfügbar

    Hinweis: Während Leistung war eine Anforderung nicht in der Auswahl berücksichtigt wurde, wie es schien, dass alle Behälter ähnlich bewertet wurden diese nach Benchmark

Test

Jeder Behälter wurde in einem typischen Asp.Net webforms Projekt verwendet wird (wie dies unser Zielanwendungstyp war). Wir haben eine einzige, einfache Seite mit einer einzigen einfachen Benutzersteuerung, die jeweils von einer Basisseite / Basissteuer vererben. Wir verwenden einen Container auf dem BasePage für einen „pro Anfrage“ scope Container und 1 auf dem global.asax für einen „Anwendung“ Umfang und versuchen zu verketten sie zusammen so Abhängigkeiten von den beiden Behältern aufgelöst werden konnten.

Jede Web-Anwendung eine erfundene Reihe von Domain-Objekten zu simulieren Mehrebenen-Abhängigkeit, Bereichstyp (Singleton / transient) geteilt und auch von verwalteten und nicht verwalteten Klassen (IDisposable erforderlich). Die „top level“ Abhängigkeits Komponenten wurden aus den Methoden auf dem BasePage manuell injiziert.

Ergebnisse

Windsor - Zufrieden alle Kriterien und hat eine gute Anamnese, Blogger-Community und Online-Dokumentation. Einfach zu bedienen und wahrscheinlich die De-facto-Wahl. Erweiterte Komponentenerstellung durch Fabrikanlage. Auch erlaubt Verkettung von individuell erstellten Container.

Spring.Net - Ausführlich und wenig hilfreich Dokumentation und keine offensichtliche / leicht programmierbare Konfiguration. Hat unterstützt keine Generika. Nicht ausgewählt

Ninject - Einfach mit guter klarer Dokumentation zu verwenden. Leistungsstarke Funktionsumfang alle unsere Anforderungen außer Container Hierarchien zu erfüllen, so wurde leider nicht gewählt.

StructureMap - schlecht dokumentiert, obwohl hatte ein recht fortgeschrittenes Feature-Set, das alle unsere Anforderungen erfüllt, aber es gab keinen eingebauten Mechanismus für Containerhierarchien obwohl zusammen für Schleifen mit gehackt werden konnte sehen, hier Der Lambda-Ausdruck Fluent Interface ein wenig mehr als kompliziert auf den ersten Blick hat, obwohl weg eingekapselt werden könnte

Einheit - Gut dokumentiert, einfach zu bedienen und erfüllt alle unsere Auswahlkriterien und hat einen einfachen Erweiterungsmechanismus die Pre / Post Schaffung Vielseitigkeits Mechanismus hinzuzufügen, wir erforderlich. Kinder Behälter hatte von einem übergeordneten Container erstellt werden.

Autofac - gut dokumentiert und relativ einfach zu bedienen, obwohl Lambda-Ausdruck-Konfiguration ein wenig scheint über kompliziert jedoch wieder leicht entfernt verkapselt werden. Komponente Scoping wird durch einen „tagging“ Mechanismus erreicht und alle Komponenten sind so konfiguriert, vorne einen Builder verwendet, die ein wenig unbequem war. Kinder Container wurden von einem übergeordneten und zugeordneten Komponenten von einem „Tag“ erstellt. Erlaubt generische Injektion.

Fazit

Unsere letzte Wahl war zwischen Windsor und Einheit, und dieses Mal um die Einheit wählten wir aufgrund seiner Benutzerfreundlichkeit, Dokumentation, Erweiterungssystem und mit ihm in „Produktion“ -Status zu sein.

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

begann ich mit Autofac vor einem Jahr und nicht zurück, da sah ..

Ich bin ein Fan Autofac, aber beide Windsor und Einheit wird einen guten Job machen (obwohl Windsor fähiger als Einheit und erfordert nicht Ihren Code zuschreibt). Es gibt viele gute nicht aus technischen Gründen für obwohl in einem System zu einem einzigen Behälter stecken.

Verwenden Sie, was funktioniert. Die meisten haben Funktionen, die sie einzigartig sind, und fast alle sind mehr feature-rich als Einheit. Wenn die Einheit alles ist, was Sie benötigen, können Sie sicher verwenden.

Mit Microsofts Einheit, nur weil es von Microsoft ist ein schlechter Weg, um eine Entscheidung zu treffen. Überlegen Sie, was Sie brauchen, und warum, und wählen Sie diejenige, die Ihren Bedürfnissen entspricht.

Allerdings habe ich zweite der Begriff auf einen einzelnen Behälter zu kleben, wenn möglich.

Ich habe mit dem Managed Extensibility Framework und fand es ganz einfach, mit zu arbeiten. Es war integriert in .NET 4 .

Wenn Sie bereits Erfahrung haben und eine persönliche preferance für eine bestimmte Unter Technologie durch eine der möglichen IoC-Container-Lösungen verwendet werden, sie funktionieren alle gut und ich sehe keinen man insbesondere mit einer „Killer-Funktion“ das macht es steht von den anderen aus. Die Einheit ist wahrscheinlich die beste Lösung für Lösungen bereits die P & P Enterprise Library 4.x verwendet ...

IoC Container Benchmark - Leistungsvergleich hat Leistung und verfügt über Vergleichstabellen für 20+ Produkte und halten sie up-to-date.

Die Schlussfolgerung aus dem Artikel:

  

SimpleInjector, Hiro, Funq, Munq und Dynamo bieten die beste   Leistung, sie sind extrem schnell. Probieren Sie es aus!

     

Besonders Einfacher Injector scheint eine gute Wahl zu sein. Es ist sehr schnell, hat eine gute   Dokumentation und auch erweiterte Szenarien wie das Abfangen unterstützt   und generische Dekorateure.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top