web-dev-qa-db-fra.com

Ninject vs Unity pour DI

Nous utilisons ASP.net MVC.

Lequel d'entre eux est le meilleur framework DI Ninject ou Unity et pourquoi?

100
Miral

La dernière fois que j'ai regardé l'un d'eux, j'ai trouvé Ninject un peu mieux. Mais les deux ont leurs inconvénients.

Ninject a un meilleur schéma de configuration fluide. Unity semble s'appuyer 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 me permettre, pourquoi limitez-vous vos choix à ces deux-là? Je pense que Castle.Windsor, Autofac et StructureMap sont au moins aussi bons ou meilleurs.

45
Mendelt

Je sais que c'est une vieille question, mais voici mes réflexions:

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

L'ObjectFactory de StructureMap me manque, mais il existe des solutions de contournement faciles à 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 temps de compilation lorsque je change quelque chose qui les affecte. La configuration XML ne fonctionne pas et moins je dois rappelez-vous pour changer le mieux que je suis.

44
roberocity

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 StackOverflowException qui est extrêmement difficile à déboguer.

10
IMLiviu

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

J'utilise à la fois la configuration xml pour mettre en place les interfaces et leurs implémentations concrètes mais ensuite j'utilise 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 affirmer que vous aurez des références à l'unité partout dans votre candidature. C'est à vous.

9
Johan Leino
7
Cantinos