405 Stimmen

Welche .NET-Abhängigkeitsinjektionsframeworks sind es wert, sich anzusehen?

Welche C#/.NET Dependency Injection-Frameworks sind es wert, sich anzusehen? Und was können Sie über ihre Komplexität und Geschwindigkeit sagen.

14 Stimmen

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

0 Stimmen

Ich schätze Ninject & Maestro. Ich freue mich, dass die am besten bewertete Antwort Ninject als "ein absolutes Vergnügen" bezeichnet.

7 Stimmen

Ich würde betonen, dass Sie sich, bevor Sie sich mit IoC-Containern beschäftigen, ohne einen auskommen sollten. Führen Sie Ihre Verdrahtung und Injektion manuell durch, es ist wirklich nicht kompliziert oder erfordert eine Menge Code, es sei denn, Sie haben wirklich komplexe oder große Systeme. Wenn Sie das Gefühl haben, dass Sie es verstehen und es mühsam wird, werden Sie besser in der Lage sein zu verstehen, welche Art von Framework Ihnen helfen würde. Es gibt jedoch keine Regel, die besagt, dass ein Projekt unbedingt einen IoC-Container haben muss, um die DI richtig durchführen zu können.

359voto

RobertTheGrey Punkte 8565

bearbeiten (nicht vom Autor): Es gibt eine umfassende Liste von IoC-Frameworks, die unter https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc verfügbar sind:

  • Castle Windsor - Castle Windsor ist das beste und ausgereifteste Inversion of Control-Container, der für .NET und Silverlight verfügbar ist
  • Unity - Leichtgewichtiger, erweiterbarer Dependency Injection-Container mit Unterstützung für Konstruktor-, Eigenschafts- und Methodenaufrufsinjektion
  • Autofac - Ein süchtig machender .NET IoC-Container
  • DryIoc - Einfacher, schneller und voll ausgestatteter IoC-Container.
  • Ninject - Der Ninja der .NET-Abhängigkeitsinjektoren
  • Spring.Net - Spring.NET ist ein Open Source-Anwendungsframework, das den Aufbau von Unternehmensanwendungen in .NET erleichtert
  • Lamar - Ein schneller IoC-Container, der stark für die Verwendung in ASP.NET Core und anderen .NET-Serveranwendungen optimiert ist.
  • LightInject - Ein ultraleichter IoC-Container
  • Simple Injector - Simple Injector ist eine einfach zu verwendende Dependency Injection (DI)-Bibliothek 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-Scanning-Erweiterungen für Microsoft.Extensions.DependencyInjection.
  • VS MEF - Managed Extensibility Framework (MEF)-Implementierung, die von Visual Studio verwendet wird.
  • TinyIoC - Ein einfach zu verwendender, problemloser Inversion of Control-Container für kleine Projekte, Bibliotheken und Anfänger gleichermaßen.
  • Stashbox - Ein leichtgewichtiger, schneller und portabler Dependency Injection-Framework für .NET-basierte Lösungen.

Originalantwort folgt.


Ich nehme an, ich bin hier vielleicht etwas pingelig, aber es ist wichtig zu beachten, dass DI (Dependency Injection) ein Programmiermuster ist und von einem IoC (Inversion of Control)-Framework ermöglicht, jedoch nicht benötigt wird. IoC-Frameworks machen DI einfach viel einfacher und bieten eine Vielzahl anderer Vorteile neben DI.

Das gesagt, ich bin mir sicher, dass das Ihre Frage war. Über IoC-Frameworks; Ich habe früher viel Spring.Net und CastleWindsor verwendet, aber der eigentliche Schmerz im Allerwertesten war die lästige XML-Konfiguration, die man schreiben musste! Sie gehen jetzt alle in diese Richtung, deshalb habe ich in den letzten Jahr StructureMap verwendet, und seitdem es auf eine fließende Konfiguration mit stark typisierten Generika und einem Register umgestiegen ist, ist meine Schmerzgrenze bei der Verwendung von IoC unter null gefallen! Es bereitet mir jetzt absolute Freude zu wissen, dass meine IoC-Konfiguration zur Kompilierzeit überprüft wird (weitgehend) und ich hatte nur Freude mit StructureMap und seiner Geschwindigkeit. Ich würde nicht behaupten, dass die anderen bei der Laufzeit langsam waren, aber sie waren für mich schwieriger einzurichten und die Frustration gewann oft den Tag.

Aktualisierung

Ich habe bei meinem letzten Projekt Ninject verwendet und es war ein absolutes Vergnügen. Die Worte fehlen mir ein wenig hier, aber (wie wir in Großbritannien sagen) dieses Framework ist 'the Dogs'. Ich würde es für alle Greenfield-Projekte empfehlen, bei denen Sie schnell einsatzbereit sein möchten. Ich habe alles, was ich brauchte, aus einem fantastischen Set von Ninject-Screencasts von Justin Etheredge erhalten. Ich kann mir nicht vorstellen, dass das Nachrüsten von Ninject in bestehenden Code ein Problem darstellt, aber das Gleiche könnte auch von StructureMap in meiner Erfahrung gesagt werden. Es wird in Zukunft eine schwierige Wahl zwischen den beiden sein, aber mir ist lieber Wettbewerb als Stillstand und es gibt eine anständige Menge an gesundem Wettbewerb da draußen.

Weitere IoC-Screencasts finden Sie auch hier auf Dimecasts.

1 Stimmen

Es ist großartig, eine qualitativ hochwertige, gut durchdachte Antwort über die Einzeiler aufsteigen zu sehen. Sie haben mich überzeugt, StructureMap auszuprobieren.

7 Stimmen

Schön, aber um fair zu sein - Windsor hat jetzt auch eine sehr schöne, vollständig ausgestattete Benutzeroberfläche.

0 Stimmen

Könnten Sie erklären, welche "vielzahl von anderen Vorteilen" IoC-Frameworks neben der einfachen Implementierung von DI bieten?

77voto

Glenn Block Punkte 8453

Es hängt davon ab, wonach du suchst, da sie jeweils ihre Vor- und Nachteile haben.

  1. Spring.NET ist das ausgereifteste, da es aus dem Spring-Framework aus der Java-Welt stammt. Spring verfügt über eine sehr umfangreiche Reihe von Framework-Bibliotheken, die es erweitern, um Web-, Windows-Unterstützung etc. zu bieten.
  2. Castle Windsor ist eines der am weitesten verbreiteten in der .NET-Plattform und verfügt über das größte Ökosystem, ist hoch konfigurierbar/erweiterbar, hat benutzerdefiniertes Lebenszyklus-Management, AOP-Unterstützung, hat inhärente NHibernate-Unterstützung und ist insgesamt ein großartiger Container. Windsor ist Teil eines gesamten Stacks, der Monorail, Active Record usw. enthält. NHibernate selbst basiert auf Windsor.
  3. Structure Map bietet eine sehr umfangreiche und feinkörnige Konfiguration durch eine interne DSL.
  4. Autofac ist ein IoC-Container der neuen Generation mit all seiner inhärenten funktionalen Programmierunterstützung. Es verfolgt auch einen anderen Ansatz zur Verwaltung der Lebensdauer als die anderen. Autofac ist noch sehr neu, aber es setzt die Messlatte dafür, was mit IoC möglich ist.
  5. Ninject habe ich gehört, ist eher minimalistisch mit einem "weniger ist mehr"-Ansatz (gehört, nicht erlebt).
  6. Der größte Unterschied von Unity ist: es stammt von und wird von Microsoft (p&p) unterstützt. Unity hat eine sehr gute Leistung und eine großartige Dokumentation. Es ist auch sehr konfigurierbar. Es hat nicht alle Funktionen von zum Beispiel Castle / Structure Map.

Zusammenfassend geht es also wirklich darum, was für dich wichtig ist. Ich stimme anderen zu, dass es sinnvoll ist zu evaluieren und zu sehen, welcher Container passt. Das Schöne ist, dass du eine schöne Auswahl an Donuts hast, anstatt nur einen mit Marmelade haben zu müssen.

5 Stimmen

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

1 Stimmen

Habe ich gesagt, dass es neuer als Unity ist? Ich sagte, es sei aus dem neuen Zeitalter ... das heißt, ich meinte seine funktionale Natur. OK, was ich gesagt habe, es ist immer noch sehr neu, was ich aber meinte, war seine Natur, nicht dass ES neu war. :-)

2 Stimmen

@Krzysztof - Ich finde Unity (zumindest wenn es fließend im Code konfiguriert ist) sehr einfach. Was hast du als schmerzhaft empfunden?

36voto

Pete Punkte 3963

Autofac. https://github.com/autofac/Autofac Es ist wirklich schnell und ziemlich gut. Hier ist ein Link mit Vergleichen (nachdem Ninject ein Speicherleckproblem behoben hat).

http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html

1 Stimmen

Ich mag Autofac, aber es ist definitiv nicht schnell. Wie Steven oben verlinkt hat: palmmedia.de/Blog/2011/8/30/…

18voto

ScottKoon Punkte 3473

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

Ich habe von vielen mir respektierten Personen gehört, dass sie Gutes über StructureMap und CastleWindsor sagen. Diese sind meiner Meinung nach die drei großen, die man sich im Moment ansehen sollte.

1 Stimmen

Ninject ist beliebt, aber es ist definitiv NICHT schnell. Es gehört tatsächlich zu den langsamsten: palmmedia.de/Blog/2011/8/30/&hellips;

14voto

Steven Punkte 322

Ich benutze Simple Injector:

Simple Injector ist eine einfache, flexible und schnelle Dependency Injection-Bibliothek, die bewährte Praktiken verwendet, um Ihre Lösungen erfolgreich zu gestalten.

4 Stimmen

Vorsicht! Einige betrachten den Service Locator als Anti-Pattern, einschließlich jemandem, der ihn eine Zeit lang benutzt hat und sogar eine Bibliothek dafür geschrieben hat: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern

4 Stimmen

Steven ist auch der Schöpfer von Simple Injector... also ist dies irgendwie eine spamige Antwort... insbesondere dass er dafür Alt-Konten verwendet hat... Simple Injector ist jedoch ziemlich schnell: palmmedia.de/Blog/2011/8/30/…

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