2009-06-28 18 views
94

Wir verwenden ASP.net MVC.Ninject vs Unity für DI

Welche von diesen ist der beste DI Rahmen Ninject oder Einheit und warum?

+94

NInject ist besser, weil Sie coole Markenmagneten von ihrer Website kaufen können. –

+5

Aktualisierte Version dieser Frage (sehr ähnlich), die einige Leute nützlich finden könnten: http: // stackoverflow.com/questions/4581791/which-c-di-ioc-framework-is-best –

Antwort

43

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

Ninject hat ein besseres Fließschema. Unity scheint sich hauptsächlich auf die XML-Konfiguration zu verlassen. Der Hauptnachteil von Ninject besteht darin, dass Sie Ninject.Core überall in Ihrem Code referenzieren müssen, um [Inject] -Attribute hinzuzufügen.

Wenn ich fragen darf, warum begrenzen Sie Ihre Entscheidungen auf diese beiden? Ich denke Castle.Windsor, Autofac und StructureMap sind mindestens so gut oder besser.

+46

Sie müssen das Inject-Attribut nur verwenden, wenn es mehr als einen Konstruktor gibt und Sie Ninject mitteilen müssen, welchen Konstruktor zu verwenden ist. Standardmäßig verwendet es den Konstruktor mit der größten Anzahl von Parametern. –

+11

In der Zwischenzeit gibt es auch eine offizielle Ninject.Web.Mvc Erweiterung. Sie ändern Ihre MvcApplication, um von NinjectHttpApplication abzuleiten, den Kernel darin hochzufahren und RegisterAllControllersIn (Assembly.GetExecutingAssembly()) aufzurufen, damit es sich um alle Controller in der gegebenen Assembly kümmert. Zauber. –

+18

Diese Antwort ist jetzt ziemlich irrelevant mit Reagrd zu Ninject 2. Während die Beschwerde für Ninject 1 legitim war, erlaubt es Ninject 2 zu arbeiten, ohne Klassen mit Attributen zu verschwenden. ninject2 wird transparent arbeiten, ohne dass Sie Ihre Klassen ändern müssen. – chillitom

9

Ich stimme Mendelt zu, es gibt kein "bestes" DI-Framework. Es hängt nur von der Situation ab und sie haben alle Vor- und Nachteile. denke David Hayden sagte auf DotNet Rocks, dass Einheit die bevorzugte Wahl ist, wenn Sie den Rest von EntLib verwenden und damit vertraut sind. Ich persönlich benutze Unity, weil mein Kunde die Tatsache mag, dass es sagt Microsoft Enterprise Library (Unity) auf den DLLs, wenn Sie bekommen, was ich sage.

Ich benutze beide xml beide Konfiguration für die Schnittstellen der Einrichtung und ihre konkreten Implementierungen aber dann in Code, den ich verwende Attribute bei der Injektion, wie:

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

und in Code:

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

persönlich Ich denke, das macht es klarer, was passiert, aber natürlich könnte man argumentieren, dass Sie in Ihrer gesamten Bewerbung Referenzen zur Einheit haben werden. Es liegt an dir.

45

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

Ich persönlich mag Ninject. Ich mag die fließenden Schnittstellen und die Vermeidung von XML. Ich mag generell XML, nur nicht für diese Art von Config-Sachen. Besonders beim Refactoring erleichtern die fließenden Schnittstellen die Korrektur.

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

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

Ich fand, dass ich die fließenden Schnittstellen nicht nur vorziehe, weil sie XML vermeiden, aber weil sie Kompilierungszeitfehler verursachen, wenn ich etwas ändere, das sie beeinflusste. Die XML-Konfiguration nicht und je weniger ich mich an erinnere mich an, um besser zu ändern, bin ich.

10

Ninject erkennt zirkuläre Abhängigkeiten, wenn Sie Injection Konstrukteurs verwenden als zur Einheit gegenüber, dass unabhängig von der Injektionstechnik nur eine Stackoverflow wirft, die extrem schwer zu debuggen.

Verwandte Themen