Ninject vs Unity pour DI [fermé]

104

Nous utilisons ASP.net MVC.

Lequel de ces derniers est le meilleur framework DI Ninject ou Unity et pourquoi?

Miral
la source
94
NInject est meilleur car vous pouvez acheter des aimants de marque sympas sur leur site Web.
Ivan G. du
5
Version mise à jour de cette question (très similaire de toute façon) que certaines personnes pourraient trouver utile: stackoverflow.com/questions/4581791/…
Jason Down

Réponses:

46

La dernière fois que j'ai regardé l'un ou l'autre, j'ai trouvé Ninject légèrement meilleur. Mais les deux ont leurs inconvénients.

Ninject a un meilleur schéma de configuration fluide. Unity semble reposer principalement sur la configuration XML. Le principal inconvénient de Ninject est qu'il vous oblige à référencer Ninject.Core partout dans votre code pour ajouter des attributs [Inject].

Si je peux demander, pourquoi limitez-vous vos choix à ces deux éléments? Je pense que Castle.Windsor, Autofac et StructureMap sont au moins aussi bons ou meilleurs.

Mendelt
la source
47
Vous ne devez utiliser l'attribut Inject que s'il y a plus d'un constructeur et que vous devez indiquer à Ninject quel constructeur utiliser. Par défaut, il utilise le constructeur avec le plus grand nombre de paramètres.
Jeffrey Cameron
11
En attendant, il existe également une extension officielle Ninject.Web.Mvc. Vous modifiez votre MvcApplication pour dériver de NinjectHttpApplication, faites tourner le noyau et appelez RegisterAllControllersIn (Assembly.GetExecutingAssembly ()) pour qu'il prenne soin de tous les contrôleurs de l'assembly donné. La magie.
Michael Stum
18
Cette réponse est maintenant assez hors de propos avec Reagrd à Ninject 2. Alors que la plainte était légitime pour Ninject 1, Ninject 2 permet de travailler sans encombrer les classes avec des attributs. ninject2 fonctionnera de manière transparente sans avoir besoin de modifier vos classes.
chillitom
3
Idem pour l'unité car il semble être complètement configurable via le code à ce stade (v3.0.1304.1)
Eric
46

Je sais que c'est une vieille question, mais voici mes pensées:

J'aime personnellement Ninject. J'aime les interfaces fluides et éviter le XML. J'aime généralement XML, mais pas pour ce genre de configuration. Surtout lorsque le refactoring est impliqué, les interfaces fluides facilitent la correction.

ObjectFactory de StructureMap me manque, mais il existe des solutions de contournement simples pour l'ajouter à Ninject.

Comme le souligne Jeffery, vous n'avez pas besoin d'utiliser l'attribut [Inject] lorsque vous n'avez qu'un seul constructeur.

J'ai trouvé que je préfère les interfaces fluides non seulement parce qu'elles évitent XML, mais parce qu'elles provoquent des erreurs de compilation lorsque je change quelque chose qui les affecte. La configuration XML ne le fait pas et moins je dois me rappeler de changer, mieux je suis.

robérocité
la source
10

Ninject détecte les dépendances circulaires si vous utilisez des constructeurs d'injection par opposition à Unity qui, quelle que soit la technique d'injection, lève simplement une exception StackOverflowException qui est extrêmement difficile à déboguer.

IMLiviu
la source
9

Je suis d'accord avec Mendelt, il n'y a pas de «meilleur» cadre de DI. Cela dépend simplement de la situation et ils ont tous des avantages et des inconvénients. pense que David Hayden a déclaré sur DotNet Rocks que Unity est le choix préféré si vous utilisez le reste d'EntLib et que vous êtes familier avec cela. J'utilise personnellement Unity parce que mon client aime le fait qu'il indique Microsoft Enterprise Library (Unity) sur les DLL, si vous obtenez ce que je dis.

J'utilise à la fois la configuration xml pour configurer les interfaces et leurs implémentations concrètes, mais j'utilise ensuite des attributs dans le code lors de l'injection, comme:

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

et en code:

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

Personnellement, je pense que cela rend plus clair ce qui se passe, mais bien sûr, on pourrait dire que vous aurez des références à l'unité partout dans votre candidature. C'est à vous.

Johan Leino
la source