Qu'est-ce que Ninject et quand l'utilisez-vous?
J'ai aidé quelques amis sur un projet et il y a une classe qui utilise Ninject. Je suis assez novice en C# et je n'ai aucune idée de ce que la classe est en train de faire, c'est pourquoi j'ai besoin de comprendre Ninject. Quelqu'un peut-il expliquer ce que Ninject est et quand doit-on utiliser(avec un exemple si possible)? Ou si vous avez des liens ce serait très bien aussi.
J'ai essayé cette question: Ninject tutoriels/documentations? mais il n'a pas vraiment aider un débutant comme moi.
- ninject est un framework injection de dépendance. commencez ici: github.com/ninject/ninject/wiki/Dependency-Injection-By-Hand pour une bonne introduction à la notion et comment l'utiliser ninject
- La documentation sur le wiki explique tout depuis les bases. ninject.org/wiki.html
Vous devez vous connecter pour publier un commentaire.
Ninject est la dépendance de l'injecteur pour .NET, la réalisation pratique du modèle d'Injection de Dépendance (formule d'Inversion de modèle de Contrôle).
Supposons que vous avez deux classes
DbRepository
etController
:Donc, maintenant vous avez deux problèmes:
Vous devez inialize
_repository
de l'utiliser. Vous avez de telles façons:Controller
classe parce que l'autre partie du code a été changé. Il n'est pas difficile si vous avez un seulController
, mais si vous avez un couple de classes qui ont dépendance sur votreRepository
vous avez un réel problème.Vous pouvez utiliser le localisateur de service ou à l'usine ou qch. Maintenant, vous avez la dépendance à votre service locator. Vous avez un service global locator et tout le code doit l'utiliser. Comment vous changera les comportements de localisateur de service lorsque vous en avez besoin pour utiliser sur une partie de code d'une logique de l'activation et de quelque chose d'autre dans l'autre partie de code? Il est seulement un moyen de transmission de service locator par les constructeurs. Mais avec de plus en plus de classes, vous aurez besoin de passer de plus en plus. De toute façon, c'est bonne idée, mais c'est une mauvaise idée.
Vous pouvez utiliser l'injection de dépendance. Regarde le code:
Maintenant, quand vous avez besoin de votre contrôleur, vous écrivez:
ninjectDevKernel.Get<Controller>();
ouninjectTestKernel.Get<Controller>();
. Vous pouvez basculer entre la dépendance des résolveurs aussi vite que vous le souhaitez. Voir? C'est simple, vous n'avez pas besoin d'écrire beaucoup.Vous ne pouvez pas faire des tests unitaires sur elle. Votre
Controller
avoir une dépendance surDbRepository
et si vous voulez tester une méthode qui utilise le référentiel, votre code de base de données et lui demander les données. C'est lent, très lent. Si votre code dansDbRepository
changements, votre unité de test surController
va tomber. Seule l'intégration de test doit dire "problèmes" dans ce cas. Ce dont vous avez besoin dans les tests unitaires - pour isoler vos classes et test d'une classe unique dans un test (dans l'idéal, une seule méthode). Si votreDbRepository
code échoue, vous allez penser queController
code échoué, et que c'est mal (même si vous avez des tests pourDbRepository
etController
- ils seront tous les deux échouer et vous pouvez commencer à partir de mauvais endroit). Il faut beaucoup de temps pour déterminer où est l'erreur vraiment. Vous devez savoir que certains de la classe est ok, et quelques autres de la classe a échoué.Lorsque vous souhaitez remplacer
DbRepository
avec quelque chose d'autre dans toutes vos classes, vous avez à faire beaucoup de travail.Vous ne pouvez pas simple de contrôle de la durée de vie de
DbRepository
. Objet de cette classe crée sur inializing deController
et supprime quandController
supprime. Il n'y a pas de partage entre les différentes instances deController
classe et il n'y a pas de partage entre les autres classes. Avec Ninject, vous pouvez simplement écrire:Et de la particularité de l'injection de dépendance - développement agile! Vous décrire ce que votre contrôleur utilise un référentiel avec interface
IRepository
. Vous n'avez pas besoin d'écrireDbRepository
, vous pouvez écrire un texte simpleMemoryRepository
de la classe et de développerController
alors que les autres gars se développeDbRepository
. LorsqueDbRepository
sera terminé, vous venez de lie de nouveau dans votre résolution de dépendances que par défautIRepository
estDbRepository
maintenant. Vous avez écrits beaucoup de contrôleurs? Tout d'entre eux utilisent maintenantDbRepository
. C'est cool.Lire la suite:
Ninject est une Inversion de Contrôle conteneur.
Que fait-il?
Supposons que vous avez un
Car
classe qui dépend d'uneDriver
classe.Afin d'utiliser le
Car
classe que vous le construire comme suit:Un Cio containter centralise les connaissances sur la façon de créer des classes. C'est un référentiel central qui en sait bien peu de choses. Par exemple, il sait que la classe de béton que vous devez utiliser pour construire une voiture est un
Driver
et non pas un autreIDriver
.Par exemple, si vous développez une application MVC, vous pouvez dire Ninject comment construire vos contrôleurs. Vous le faites en vous inscrivant concrètes qui répond à des interfaces spécifiques. Au moment de l'exécution Ninject va déterminer les classes sont nécessaires pour construire le contrôleur requis, et tous derrière les coulisses.
Ceci est intéressant, car il permet de construire des systèmes qui sont plus facilement unité vérifiable. Supposons que
Driver
encapsule tous les accès de base de données pourCar
. Dans un test unitaire pour la Voiture, vous pouvez faire ceci:Entières de cadres qui prennent soin de créer automatiquement des tests de classe pour vous et ils sont appelés les moqueries des cadres.
Pour plus d'informations:
D'autres réponses sont grands, mais je tiens également à souligner cette La mise en œuvre de l'Injection de Dépendance à l'aide Ninject article.
C'est l'un des meilleurs articles que j'ai jamais lu ce qui explique l'Injection de Dépendance et Ninject avec un très bel exemple.
Voici l'extrait de l'article:
Interface ci-dessous seront mises en œuvre par notre (SMSService) et (MockSMSService), en gros, la nouvelle Interface (ISMSService) permettront d'exposer les mêmes comportements que les deux services comme le code ci-dessous:
(SMSService) mise en œuvre pour mettre en œuvre le (ISMSService) interface:
(MockSMSService) totalement différente de la mise en œuvre à l'aide de la même interface:
nous avons besoin pour mettre en œuvre un changement à notre (UIHandler) le constructeur de la classe de passer de la dépendance à travers elle, ce faisant, le code qui utilise l' (UIHandler) peut déterminer la mise en œuvre concrète de (ISMSService) à utiliser:
Maintenant, nous devons créer une catégorie distincte (NinjectBindings) qui hérite de l' (NinjectModule). Cette classe sera responsable de la résolution des problèmes de dépendance au moment de l'exécution, puis nous allons remplacer la charge de l'événement qui est utilisé pour configurer la liaison en elle. La bonne chose à propos Ninject est que nous n'avons pas besoin de modifier notre code (ISMSService), (SMSService), et (MockSMSService).
Maintenant dans l'INTERFACE utilisateur le code du formulaire, nous allons utiliser la liaison pour Ninject qui va déterminer la mise en œuvre d'utilisation:
Maintenant le code est à l'aide de la Ninject Kernel pour résoudre de toute la chaîne de dépendances, si nous voulons utiliser le service réel (SMSService) en mode Release (sur l'environnement de production) au lieu de se moquer de l'un, nous avons besoin de changer les Ninject de liaison de la classe (NinjectBindings) à utiliser uniquement le droit de la mise en œuvre ou en utilisant le #if DEBUG directive comme ci-dessous:
Maintenant notre classe binding (NinjectBindings) vit sur le haut de l'ensemble de notre code d'exécution et nous pouvons contrôler la configuration facilement dans un seul endroit.
Aussi, voir Qu'est-ce que l'Inversion de Contrôle? quelques exemples très simples, sont mentionnés comprendre Cio.