it-swarm.com.de

Ninject vs Unity für DI

Wir verwenden ASP.net MVC.

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

100
Miral

Das letzte Mal, als ich mir einen von beiden ansah, fand ich Ninject etwas besser. Aber beide haben ihre Nachteile.

Ninject verfügt über ein besseres Schema für die flüssige Konfiguration. Unity scheint sich hauptsächlich auf die XML-Konfiguration zu stützen. Der Hauptnachteil von Ninject besteht darin, dass Sie auf Ninject verweisen müssen.Kern Sie überall in Ihrem Code, 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.

45
Mendelt

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 die Vermeidung von XML. Generell mag ich XML, nur nicht für solche Konfigurationssachen. Insbesondere bei Refactoring erleichtern die fließenden Schnittstellen die Korrektur.

Ich vermisse die ObjectFactory von StructureMap, aber es gibt einfache Problemumgehungen, um dies 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 deshalb 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 erinnere mich ändern muss, desto besser wird es mir.

44
roberocity

Ninject erkennt zirkuläre Abhängigkeiten, wenn Sie Injection Constructors anstelle von Unity verwenden, die unabhängig von der Injektionstechnik nur eine StackOverflowException auslösen, die sich nur schwer debuggen lässt.

10
IMLiviu

Ich stimme Mendelt zu, es gibt kein "bestes" DI-Framework. Es kommt nur auf die Situation an und sie haben alle 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 es meinem Kunden gefällt, dass auf den DLLs Microsoft Enterprise Library (Unity) steht, wenn Sie wissen, was ich sage.

Ich verwende beide XML-Konfigurationen zum Einrichten der Schnittstellen und ihrer konkreten Implementierungen, verwende dann aber beim Injizieren Attribute im Code wie:

<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 Bewerbung Verweise auf die Einheit haben werden. Es liegt an dir.

9
Johan Leino
7
Cantinos