Quels cadres d'injection de dépendances .NET méritent d'être examinés? [fermé]


386

Quels cadres d'injection de dépendance C # /. NET méritent d'être étudiés? Et que dire de leur complexité et de leur rapidité.


13
IoC Container Benchmark - La comparaison des performances comporte des tableaux de comparaison des performances et des fonctionnalités pour plus de 20 produits et les tient à jour. Il recommande Simple Injector
Michael Freidgeim

J'apprécie Ninject & Maestro. Je suis heureux que la réponse la mieux notée fasse de Ninject un "plaisir absolu"
Razvan Dumitru

6
Je voudrais souligner qu'avant de regarder dans les conteneurs IoC, vous devez vous en passer sans. Faites votre câblage et votre injection manuellement, ce n'est pas vraiment compliqué ou nécessite beaucoup de code, sauf si vous avez des systèmes vraiment complexes ou de grande taille. Lorsque vous sentez que vous le comprenez et qu'il devient difficile, vous serez mieux placé pour comprendre quel type de cadre vous aidera. mais il n'y a pas de règle qui dit qu'un projet DOIT avoir un conteneur IoC juste pour pouvoir faire DI correctement.
sara

1
Commencez avec aucun. Créez manuellement le graphique des objets requis. Différents cadres ont différentes approches qui dépendent de vos besoins. Avant d'en choisir un, vous devez reconnaître les fonctionnalités dont vous avez le plus besoin.
Fabio

Étant donné que dotnetcore est l'avenir, vous pouvez tout aussi bien vous en tenir à son support DI intégré. C'est très bon et hautement personnalisable.
ATL_DEV

Réponses:


340

modifier (pas par l'auteur): Il existe une liste complète des cadres IoC disponibles sur https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc :

  • Castle Windsor - Castle Windsor est le meilleur conteneur de l'inversion de contrôle mature disponible pour .NET et Silverlight
  • Unity - Conteneur d'injection de dépendance extensible léger avec prise en charge de l'injection d'appel de constructeur, de propriété et de méthode
  • Autofac - Un conteneur IoC .NET addictif
  • DryIoc - Conteneur IoC simple, rapide et complet.
  • Ninject - Le ninja des injecteurs de dépendance .NET
  • StructureMap - Le conteneur IoC / DI d'origine pour .Net
  • Spring.Net - Spring.NET est un cadre d'application open source qui facilite la création d'applications .NET d'entreprise
  • LightInject - Un conteneur IoC ultra léger
  • Injecteur simple - L' injecteur simple est une bibliothèque d'Injection de dépendances (DI) facile à utiliser pour .NET 4+ qui prend en charge Silverlight 4+, Windows Phone 8, Windows 8, y compris les applications universelles et Mono.
  • Microsoft.Extensions.DependencyInjection - Le conteneur IoC par défaut pour les applications ASP.NET Core.
  • Scrutor - Extensions de numérisation d'assemblage pour Microsoft.Extensions.DependencyInjection.
  • VS MEF - Implémentation de Managed Extensibility Framework (MEF) utilisée par Visual Studio.
  • TinyIoC - Un conteneur d'inversion de contrôle facile à utiliser et sans tracas pour les petits projets, les bibliothèques et les débutants.

La réponse originale suit.


Je suppose que je pourrais être un peu difficile ici, mais il est important de noter que DI (Dependency Injection) est un modèle de programmation et est facilité par, mais ne nécessite pas, un cadre IoC (Inversion of Control). Les frameworks IoC rendent la DI beaucoup plus facile et ils offrent une foule d'autres avantages en plus de la DI.

Cela étant dit, je suis sûr que c'est ce que vous demandiez. À propos des cadres IoC; J'utilisais beaucoup Spring.Net et CastleWindsor , mais la vraie douleur à l'arrière était toute cette configuration XML embêtante que vous deviez écrire! Ils évoluent à peu près tous de cette façon maintenant, donc j'utilise StructureMap depuis environ un an, et depuis qu'il est passé à une configuration fluide en utilisant des génériques fortement typés et un registre, ma barrière de douleur dans l'utilisation d'IoC est tombée à en dessous de zéro! Je reçois un coup de pied absolu en sachant maintenant que ma configuration IoC est vérifiée au moment de la compilation (pour la plupart) et je n'ai eu que de la joie avec StructureMap et sa vitesse. Je ne dirai pas que les autres étaient lents à l'exécution, mais ils étaient plus difficiles à installer et la frustration l'emportait souvent.

Mise à jour

J'utilise Ninject sur mon dernier projet et ce fut un plaisir absolu à utiliser. Les mots me manquent un peu ici, mais (comme on dit au Royaume-Uni) ce cadre est «les chiens». Je le recommande vivement pour tous les projets de champs verts où vous souhaitez être opérationnel rapidement. J'ai obtenu tout ce dont j'avais besoin grâce à un fantastique ensemble de screencasts Ninject de Justin Etheredge. Je ne vois pas du tout que l'ajustement de Ninject dans le code existant soit un problème, mais on pourrait dire la même chose de StructureMap dans mon expérience. Ce sera un choix difficile à l'avenir entre ces deux-là, mais je préfère la compétition à la stagnation et il y a une bonne quantité de concurrence saine là-bas.

D'autres screencasts IoC peuvent également être trouvés ici sur Dimecasts .


1
C'est formidable de voir une réponse de qualité, bien pensée, sur les doublures. Vous m'avez convaincu de consulter StructureMap.
Chris Marasti-Georg

7
Agréable mais pour être juste - Windsor a maintenant une très bonne interface fluide à part entière.
Krzysztof Kozmic

Pourriez-vous expliquer quelles sont les «nombreuses autres prestations» offertes par les cadres IoC en plus de la mise en œuvre facile de DI?
fearofawhackplanet

@fearofawhackplanet l'une des seules choses qu'un conteneur IoC peut faire qui ne peut pas être fait avec l'ID du pauvre est l' interception . Bon résumé ici: kenneth-truyers.net/2013/05/16/…
Mathieu Guindon

1
J'ai lu quelques sources qui disent que Ninject est le palmmedia.de/blog/2011/8/30/… et stackoverflow.com/questions/4581791/…
Luke T O'Brien

77

Cela dépend de ce que vous recherchez, car chacun a ses avantages et ses inconvénients.

  1. Spring.NETest le plus mature car il sort du printemps du monde Java. Spring dispose d'un ensemble très riche de bibliothèques de frameworks qui l'étendent pour prendre en charge le Web, Windows, etc.
  2. Castle Windsorest l'un des plus largement utilisés dans la plate-forme .NET et possède le plus grand écosystème, est hautement configurable / extensible, a une gestion de la vie personnalisée, un support AOP, a un support NHibernate inhérent et est un conteneur génial. Windsor fait partie d'une pile complète qui comprend Monorail, Active Record, etc. NHibernate se construit au-dessus de Windsor.
  3. Structure Map a une configuration très riche et à grain fin via une DSL interne.
  4. Autofacest un conteneur IoC de la nouvelle ère avec tout son support de programmation fonctionnelle inhérent. Il gère également une approche de la gestion de la vie différente des autres. Autofac est encore très nouveau, mais il pousse la barre sur ce qui est possible avec IoC.
  5. Ninject J'ai entendu dire que les os sont plus nus avec une approche moins est plus (entendu sans expérience).
  6. Le plus grand discriminateur Unityest: il est de et pris en charge par Microsoft (p & p). Unity a de très bonnes performances et une excellente documentation. Il est également hautement configurable. Il n'a pas toutes les cloches et les sifflets de la carte du château / structure.

Donc, en résumé, cela dépend vraiment de ce qui est important pour vous. Je serais d'accord avec les autres pour aller évaluer et voir lequel correspond. La bonne chose est que vous avez une belle sélection de beignets plutôt que de simplement en avoir une gelée.


4
Autofac n'est en fait pas si nouveau, il est plus ancien que Unity :)
Nicholas Blumhardt

1
Ai-je dit que c'était plus récent que Unity? J'ai dit que c'était du nouvel âge ... c'est-à-dire que je voulais dire que c'est de nature fonctionnelle. OK, ce que j'ai dit c'est encore très nouveau, ce que je voulais dire, c'est que c'est la nature et non que l'informatique était nouvelle. :-)
Glenn Block

2
@ Krzysztof - Je trouve Unity mort facile (au moins lorsqu'il est configuré couramment dans le code). Qu'avez-vous trouvé douloureux?
TrueWill


6
Voici une référence de performance intéressante: palmmedia.de/Blog/2011/8/30/…
Steven


18

Ninject est génial. Cela semble vraiment rapide, mais je n'ai fait aucune comparaison. Je sais que Nate, l'auteur, a fait des comparaisons entre Ninject et d'autres cadres DI et cherche d'autres moyens d'améliorer la vitesse de Ninject.

J'ai entendu beaucoup de gens que je respecte dire de bonnes choses sur StructureMap et CastleWindsor. Ce sont, à mon avis, les trois grands à considérer en ce moment.


1
Ninject est populaire mais il n'est certainement PAS rapide. C'est en fait l'un des plus lents du marché: palmmedia.de/Blog/2011/8/30/…
Serj Sagan

13

J'utilise Simple Injector :

Simple Injector est une bibliothèque d'injection de dépendances facile, flexible et rapide qui utilise les meilleures pratiques pour guider vos solutions vers le gouffre du succès.


4
Attention, certains considèrent le localisateur de services comme un anti-modèle, y compris quelqu'un qui l'a utilisé pendant un certain temps et a même écrit une bibliothèque pour cela: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern
Philippe

4
Steven est également le créateur de Simple Injector ... c'est donc une sorte de réponse de spam ... surtout qu'il a utilisé un compte alt pour le faire ... Simple Injector est assez rapide cependant: palmmedia.de/Blog/2011/ 8/30 /…
Serj Sagan

8

Je suis un grand fan de Castle. J'adore les installations qu'il propose également au-delà de l'histoire des conteneurs IoC. Cela simplifie vraiment l'utilisation de NHibernate, la journalisation, AOP, etc. J'utilise également Binsor pour la configuration avec Boo et je suis vraiment tombé amoureux de Boo comme langue à cause de cela.



5

J'ai passé la meilleure partie d'une journée à lutter sans succès pour faire fonctionner l'exemple Spring.NET le plus simple. Je n'ai jamais pu trouver comment l'obtenir pour trouver mon assembly à partir du fichier XML. En environ 2 heures, d'un autre côté, j'ai pu faire fonctionner Ninject, y compris le test d'intégration avec NUnit et MSTest.


4

J'ai utilisé Spring.NET dans le passé et j'ai eu beaucoup de succès avec. Je n'ai jamais remarqué de frais généraux substantiels, bien que le projet sur lequel nous l'avons utilisé était assez lourd en soi. Il n'a fallu qu'un peu de temps pour lire la documentation pour la configurer.


2

La grande chose à propos de C # est qu'il suit un chemin battu par des années de développeurs Java avant lui. Donc, mon conseil, d'une manière générale lors de la recherche d'outils de cette nature, est de chercher la bonne réponse Java et de voir s'il existe encore une adaptation .NET.

Donc, quand il s'agit de DI (et il y a tellement d'options là-bas, c'est vraiment une question de goût) est Spring.NET . De plus, il est toujours sage de rechercher les personnes derrière les projets. Je n'ai aucun problème à suggérer des produits SourceGear pour le contrôle des sources (en dehors de les utiliser) parce que j'ai du respect pour Eric Sink. J'ai vu Mark Pollack parler et que puis-je dire, le gars comprend.

En fin de compte, il existe de nombreux cadres DI et votre meilleur pari est de faire quelques exemples de projets avec quelques-uns d'entre eux et de faire un choix éclairé.

Bonne chance!


2

Je pense qu'un bon endroit pour commencer est avec Ninject, il est nouveau et a pris en compte beaucoup de réglages fins et est vraiment rapide. Nate, le développeur, a vraiment un excellent site et un excellent support.


Pourquoi dites-vous que c'est rapide ??? C'est l'un des plus lents qui soit! palmmedia.de/Blog/2011/8/30/…
Serj Sagan

2

Spring.Net est assez solide, mais la documentation a pris un certain temps à parcourir. Autofac est bon, et bien que .Net 2.0 soit pris en charge, vous avez besoin de VS 2008 pour le compiler, ou bien utilisez la ligne de commande pour créer votre application.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.