Wir verwenden ASP.net MVC.
Welches davon ist das beste DI-Framework Ninject oder Unity und warum?
Wir verwenden ASP.net MVC.
Welches davon ist das beste DI-Framework Ninject oder Unity und warum?
Antworten:
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.
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.
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.
http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison
Die Einheit ist schneller, aber nicht die beste