Welche .NET Dependency Injection-Frameworks sind einen Blick wert? [geschlossen]


386

Welche C # /. NET Dependency Injection Frameworks sind einen Blick wert? Und was können Sie über ihre Komplexität und Geschwindigkeit sagen.


13
IoC Container Benchmark - Der Leistungsvergleich enthält Leistungs- und Funktionsvergleichstabellen für mehr als 20 Produkte und hält diese auf dem neuesten Stand. Es empfiehlt Simple Injector
Michael Freidgeim

Ich schätze Ninject & Maestro. Ich bin froh, dass die bestbewertete Antwort Ninject als "ein absolutes Vergnügen" bezeichnet
Razvan Dumitru

6
Ich möchte betonen, dass Sie, bevor Sie sich mit IoC-Containern befassen, ohne einen auskommen sollten. Führen Sie Ihre Verkabelung und Einspritzung manuell durch, es ist nicht wirklich kompliziert oder erfordert überhaupt viel Code, es sei denn, Sie haben einige wirklich komplexe oder große Systeme. Wenn Sie das Gefühl haben, dass Sie es verstehen und dass es unangenehm wird, sind Sie besser in der Lage zu verstehen, welche Art von Framework Ihnen helfen wird. Es gibt jedoch keine Regel, die besagt, dass ein Projekt einen IoC-Container haben muss, um DI ordnungsgemäß ausführen zu können.
Sara

1
Beginnen Sie mit keiner. Erstellen Sie das erforderliche Objektdiagramm manuell. Unterschiedliche Frameworks haben unterschiedliche Ansätze, die von Ihren Anforderungen abhängen. Bevor Sie eine auswählen, müssen Sie erkennen, welche Funktionen Sie am meisten benötigen.
Fabio

Da dotnetcore die Zukunft ist, können Sie sich genauso gut an die integrierte DI-Unterstützung halten. Es ist sehr gut und sehr anpassbar.
ATL_DEV

Antworten:


339

Bearbeiten (nicht vom Autor): Eine umfassende Liste der IoC-Frameworks finden Sie unter https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc :

  • Castle Windsor - Castle Windsor ist der beste, ausgereifte Inversion of Control-Container für .NET und Silverlight
  • Unity - Leichter erweiterbarer Abhängigkeitsinjektionscontainer mit Unterstützung für die Injektion von Konstruktor-, Eigenschafts- und Methodenaufrufen
  • Autofac - Ein süchtig machender .NET IoC-Container
  • DryIoc - Einfacher, schneller IoC-Container mit vollem Funktionsumfang.
  • Ninject - Der Ninja von .NET-Abhängigkeitsinjektoren
  • StructureMap - Der ursprüngliche IoC / DI-Container für .Net
  • Spring.Net - Spring.NET ist ein Open Source-Anwendungsframework, das das Erstellen von .NET-Unternehmensanwendungen erleichtert
  • LightInject - Ein ultraleichter IoC-Container
  • Simple Injector - Simple Injector ist eine benutzerfreundliche DI-Bibliothek (Dependency Injection) für .NET 4+, die Silverlight 4+, Windows Phone 8, Windows 8 einschließlich Universal Apps und Mono unterstützt.
  • Microsoft.Extensions.DependencyInjection - Der Standard-IoC-Container für ASP.NET Core-Anwendungen.
  • Scrutor - Assembly-Scan-Erweiterungen für Microsoft.Extensions.DependencyInjection.
  • VS MEF - MEF-Implementierung (Managed Extensibility Framework), die von Visual Studio verwendet wird.
  • TinyIoC - Ein einfach zu bedienender, problemloser Inversion of Control Container für kleine Projekte, Bibliotheken und Anfänger.

Die ursprüngliche Antwort folgt.


Ich nehme an, dass ich hier etwas wählerisch bin, aber es ist wichtig zu beachten, dass DI (Dependency Injection) ein Programmiermuster ist und durch ein IoC-Framework (Inversion of Control) erleichtert wird, aber nicht erforderlich ist. IoC-Frameworks vereinfachen DI erheblich und bieten über DI hinaus eine Reihe weiterer Vorteile.

Davon abgesehen bin ich sicher, dass Sie das gefragt haben. Informationen zu IoC-Frameworks; Ich habe Spring.Net und CastleWindsor oft benutzt , aber der wahre Schmerz im Hintergrund war all die lästige XML-Konfiguration, die Sie schreiben mussten! Sie bewegen sich jetzt so ziemlich alle auf diese Weise, daher verwende ich StructureMap seit ungefähr einem Jahr. Seitdem es zu einer fließenden Konfiguration mit stark typisierten Generika und einer Registrierung übergegangen ist, ist meine Schmerzgrenze bei der Verwendung von IoC gesunken unter Null! Ich habe einen absoluten Kick davon zu wissen, dass meine IoC-Konfiguration (zum größten Teil) zur Kompilierungszeit überprüft wird und ich nur Freude an StructureMap und seiner Geschwindigkeit hatte. Ich werde nicht sagen, dass die anderen zur Laufzeit langsam waren, aber sie waren für mich schwieriger einzurichten und Frustration gewann oft den Tag.

Aktualisieren

Ich habe Ninject in meinem neuesten Projekt verwendet und es war eine absolute Freude, es zu verwenden. Die Worte versagen mir hier ein bisschen, aber (wie wir in Großbritannien sagen) dieser Rahmen ist "die Hunde". Ich kann es nur empfehlen für Projekte auf der grünen Wiese, bei denen Sie schnell einsatzbereit sein möchten. Ich habe alles, was ich brauchte, aus einem fantastischen Satz von Ninject-Screencasts von Justin Etheredge bekommen. Ich kann nicht sehen, dass das Nachrüsten von Ninject in vorhandenen Code überhaupt ein Problem darstellt, aber meiner Erfahrung nach könnte das Gleiche von StructureMap gesagt werden . Es wird eine schwierige Entscheidung zwischen diesen beiden sein, aber ich hätte lieber Konkurrenz als Stagnation und es gibt eine anständige Menge an gesundem Wettbewerb da draußen.

Weitere IoC-Screencasts finden Sie auch hier auf Dimecasts .


1
Es ist großartig zu sehen, wie eine hochwertige, gut durchdachte Antwort über die Einzeiler aufsteigt. Sie haben mich überzeugt, StructureMap zu testen.
Chris Marasti-Georg

7
Schön, aber um fair zu sein - Windsor hat jetzt auch eine sehr schöne, vollwertige, fließende Oberfläche.
Krzysztof Kozmic

Können Sie erklären, welche IoC-Frameworks neben der einfachen Implementierung von DI die "Vielzahl anderer Vorteile" bieten?
Fearofawhackplanet

@fearofawhackplanet Eines der wenigen Dinge, die ein IoC-Container tun kann, die mit dem DI eines armen Mannes nicht möglich sind, ist das Abfangen . Gute Zusammenfassung hier: kenneth-truyers.net/2013/05/16/…
Mathieu Guindon

1
Ich habe einige Quellen gelesen, die besagen, dass Ninject das langsamste palmmedia.de/blog/2011/8/30/… und stackoverflow.com/questions/4581791/… ist
Luke T O'Brien

77

Es hängt davon ab, wonach Sie suchen, da jeder seine Vor- und Nachteile hat.

  1. Spring.NETist am ausgereiftesten, da es aus dem Frühling aus der Java-Welt kommt. Spring verfügt über eine Vielzahl von Framework-Bibliotheken, die es auf die Unterstützung von Web, Windows usw. erweitern.
  2. Castle Windsorist eine der am weitesten verbreiteten in der .NET-Plattform und verfügt über das größte Ökosystem, ist hoch konfigurierbar / erweiterbar, verfügt über ein benutzerdefiniertes Lifetime-Management, AOP-Unterstützung, NHibernate-Unterstützung und ist ein rundum beeindruckender Container. Windsor ist Teil eines gesamten Stacks, der Monorail, Active Record usw. enthält. NHibernate selbst baut auf Windsor auf.
  3. Structure Map hat eine sehr reichhaltige und feinkörnige Konfiguration über ein internes DSL.
  4. Autofacist ein IoC-Container des neuen Zeitalters mit all seiner inhärenten Unterstützung für funktionale Programmierung. Bei der Verwaltung der Lebensdauer wird auch ein anderer Ansatz verfolgt als bei den anderen. Autofac ist noch sehr neu, aber es legt die Messlatte für das, was mit IoC möglich ist.
  5. Ninject Ich habe gehört, ist mehr nackte Knochen mit weniger ist mehr Ansatz (gehört nicht erlebt).
  6. Der größte Diskriminator Unityist: Es stammt von Microsoft und wird von Microsoft unterstützt (p & p). Unity hat eine sehr gute Leistung und eine großartige Dokumentation. Es ist auch sehr konfigurierbar. Es hat nicht alle Schnickschnack von beispielsweise Castle / Structure Map.

Zusammenfassend hängt es also wirklich davon ab, was für Sie wichtig ist. Ich würde anderen zustimmen, zu gehen und zu bewerten und zu sehen, welches passt. Das Schöne ist, dass Sie eine schöne Auswahl an Donuts haben, anstatt nur einen Gelee zu haben.


4
Autofac ist eigentlich nicht so neu, es ist älter als Unity :)
Nicholas Blumhardt

1
Habe ich gesagt, es ist neuer als Unity? Ich sagte, es ist aus dem neuen Zeitalter ... dh ich meinte, es ist funktionale Natur. OK, was ich sagte, es ist immer noch sehr neu, aber ich meinte, es liegt in der Natur, dass IT nicht neu ist. :-)
Glenn Block

2
@Krzysztof - Ich finde Unity kinderleicht (zumindest wenn es fließend im Code konfiguriert ist). Was hat dir wehgetan?
TrueWill


6
Hier ist ein interessanter Leistungsmaßstab: palmmedia.de/Blog/2011/8/30/…
Steven


18

Ninject ist großartig. Es scheint sehr schnell zu sein, aber ich habe keine Vergleiche gemacht. Ich weiß, dass Nate, der Autor, einige Vergleiche zwischen Ninject und anderen DI-Frameworks durchgeführt hat und nach weiteren Möglichkeiten sucht, um die Geschwindigkeit von Ninject zu verbessern.

Ich habe viele Leute gehört, die ich respektiere und die gute Dinge über StructureMap und CastleWindsor sagen. Das sind meiner Meinung nach die großen Drei, die man sich gerade ansehen sollte.


1
Ninject ist beliebt, aber es ist sicherlich nicht schnell. Es ist tatsächlich eines der langsamsten da draußen: palmmedia.de/Blog/2011/8/30/…
Serj Sagan

13

Ich benutze Simple Injector :

Simple Injector ist eine einfache, flexible und schnelle Abhängigkeitsinjektionsbibliothek, die bewährte Methoden verwendet, um Ihre Lösungen in Richtung Erfolg zu führen.


4
Beachten Sie, dass einige den Service Locator als Anti-Pattern betrachten, einschließlich derer, die ihn einige Zeit verwendet und sogar eine Bibliothek dafür geschrieben haben: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern
Philippe

4
Steven ist auch der Schöpfer von Simple Injector ... das ist also eine Art Spam-Antwort ... vor allem, dass er dafür ein Alt- Konto verwendet hat
Serj Sagan

8

Ich bin ein großer Fan von Castle. Ich mag die Einrichtungen, die es auch jenseits der IoC Container-Geschichte bietet. Es ist wirklich einfach, NHibernate, Protokollierung, AOP usw. zu verwenden. Ich verwende Binsor auch für die Konfiguration mit Boo und habe mich deshalb wirklich in Boo als Sprache verliebt.



5

Ich habe den größten Teil eines Tages ohne Erfolg damit verbracht, das einfachste Spring.NET-Beispiel zum Laufen zu bringen. Konnte nie herausfinden, wie ich meine Assembly aus der XML-Datei finden kann. In ungefähr 2 Stunden konnte ich Ninject zum Laufen bringen, einschließlich des Testens der Integration mit NUnit und MSTest.


4

Ich habe Spring.NET in der Vergangenheit verwendet und hatte großen Erfolg damit. Ich habe nie einen erheblichen Aufwand damit bemerkt, obwohl das Projekt, für das wir es verwendet haben, für sich genommen ziemlich schwer war. Das Durchlesen der Dokumentation dauerte nur ein wenig, bis sie eingerichtet war.


2

Das Tolle an C # ist, dass es einem Weg folgt, den jahrelange Java-Entwickler zuvor eingeschlagen haben. Mein Rat, also im Allgemeinen bei der Suche nach Tools dieser Art, ist, nach der soliden Java-Antwort zu suchen und zu prüfen, ob es noch eine .NET-Anpassung gibt.

Wenn es also um DI geht (und es gibt so viele Optionen, das ist wirklich Geschmackssache), ist Spring.NET . Darüber hinaus ist es immer ratsam, die Menschen hinter Projekten zu recherchieren. Ich habe kein Problem damit, SourceGear-Produkte für die Quellcodeverwaltung vorzuschlagen (außerhalb ihrer Verwendung), da ich Respekt vor Eric Sink habe. Ich habe Mark Pollack sprechen sehen und was soll ich sagen, der Typ versteht es einfach.

Am Ende gibt es viele DI-Frameworks, und Sie sollten am besten einige Beispielprojekte mit einigen von ihnen durchführen und eine fundierte Entscheidung treffen.

Viel Glück!


2

Ich denke, ein guter Anfang ist Ninject, es ist neu und hat viele Feinabstimmungen berücksichtigt und ist sehr schnell. Nate, der Entwickler, hat wirklich eine großartige Seite und großartigen Support.


Warum sagst du, dass es schnell ist ??? Es ist eines der langsamsten, die es gibt! palmmedia.de/Blog/2011/8/30/…
Serj Sagan

2

Spring.Net ist ziemlich solide, aber die Dokumentation hat einige Zeit in Anspruch genommen. Autofac ist gut und obwohl .Net 2.0 unterstützt wird, benötigen Sie VS 2008, um es zu kompilieren, oder verwenden Sie die Befehlszeile, um Ihre App zu erstellen.

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.