Ninject vs Unity für DI [geschlossen]

104

Wir verwenden ASP.net MVC.

Welches davon ist das beste DI-Framework Ninject oder Unity und warum?

Miral
quelle
94
NInject ist besser, weil Sie coole Markenmagnete von ihrer Website kaufen können.
Ivan G.
5
Aktualisierte Version dieser Frage (ohnehin sehr ähnlich), die einige Leute vielleicht nützlich finden: stackoverflow.com/questions/4581791/…
Jason Down

Antworten:

46

Als ich das letzte Mal einen von beiden angesehen habe, fand ich Ninject etwas besser. Aber beide haben ihre Nachteile.

Ninject hat ein besseres Schema für die fließende Konfiguration. Unity scheint hauptsächlich auf der XML-Konfiguration zu beruhen. Der Hauptnachteil von Ninject besteht darin, dass Sie auf Ninject.Core überall in Ihrem Code verweisen müssen, um [Inject] -Attribute hinzuzufügen.

Wenn ich fragen darf, warum beschränken Sie Ihre Auswahl auf diese beiden? Ich denke, Castle.Windsor, Autofac und StructureMap sind mindestens genauso gut oder besser.

Mendelt
quelle
47
Sie müssen das Inject-Attribut nur verwenden, wenn mehr als ein Konstruktor vorhanden ist, und Sie müssen Ninject mitteilen, welcher Konstruktor verwendet werden soll. Standardmäßig wird der Konstruktor mit den meisten Parametern verwendet.
Jeffrey Cameron
11
In der Zwischenzeit gibt es auch eine offizielle Ninject.Web.Mvc-Erweiterung. Sie ändern Ihre MvcApplication so, dass sie von NinjectHttpApplication abgeleitet ist, drehen den darin enthaltenen Kernel hoch und rufen RegisterAllControllersIn (Assembly.GetExecutingAssembly ()) auf, damit er sich um alle Controller in der angegebenen Assembly kümmert. Magie.
Michael Stum
18
Diese Antwort ist jetzt für Ninject 2 ziemlich irrelevant. Während die Beschwerde für Ninject 1 legitim war, erlaubt Ninject 2, zu arbeiten, ohne dort Klassen mit Attributen zu verunreinigen. ninject2 arbeitet transparent, ohne dass Sie Ihre Klassen ändern müssen.
Chillitom
3
Gleiches gilt für Unity, da es an dieser Stelle (v3.0.1304.1) vollständig über Code konfigurierbar zu sein scheint
Eric
46

Ich weiß, dass dies eine alte Frage ist, aber hier sind meine Gedanken:

Ich persönlich mag Ninject. Ich mag die fließenden Schnittstellen und das Vermeiden von XML. Ich mag im Allgemeinen XML, nur nicht für diese Art von Konfigurationsmaterial. Insbesondere beim Refactoring erleichtern die fließenden Schnittstellen die Korrektur.

Ich vermisse die ObjectFactory von StructureMap, aber es gibt einfache Problemumgehungen, um diese zu Ninject hinzuzufügen.

Wie Jeffery betont, müssen Sie das Attribut [Inject] nicht verwenden, wenn Sie nur einen Konstruktor haben.

Ich habe festgestellt, dass ich die fließenden Schnittstellen nicht nur bevorzuge, weil sie XML vermeiden, sondern weil sie Fehler bei der Kompilierung verursachen, wenn ich etwas ändere, das sie betrifft. Die XML-Konfiguration funktioniert nicht und je weniger ich mich daran erinnern muss, um sie zu ändern, desto besser geht es mir.

Roberocity
quelle
10

Ninject erkennt zirkuläre Abhängigkeiten, wenn Sie Injektionskonstruktoren im Gegensatz zu Unity verwenden, die unabhängig von der Injektionstechnik nur eine StackOverflowException auslösen, die extrem schwer zu debuggen ist.

IMLiviu
quelle
9

Ich stimme Mendelt zu, es gibt kein "bestes" DI-Framework. Es kommt nur auf die Situation an und alle haben Vor- und Nachteile. Ich denke, David Hayden sagte auf DotNet Rocks, dass Unity die bevorzugte Wahl ist, wenn Sie den Rest von EntLib verwenden und damit vertraut sind. Ich persönlich benutze Unity, weil meinem Kunden die Tatsache gefällt, dass in den DLLs Microsoft Enterprise Library (Unity) steht, wenn Sie verstehen, was ich sage.

Ich verwende sowohl die XML-Konfiguration zum Einrichten der Schnittstellen als auch deren konkrete Implementierungen, aber dann verwende ich beim Injizieren Attribute im Code, wie zum Beispiel:

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

und im Code:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)

Persönlich denke ich, dass dies klarer macht, was passiert, aber natürlich könnte man argumentieren, dass Sie in Ihrer gesamten Anwendung Verweise auf die Einheit haben werden. Es liegt an dir.

Johan Leino
quelle