Comment Utiliser Ninject
J'ai essayé d'utiliser Ninject aujourd'hui et d'avoir un couple de questions. Tout d'abord je dois utiliser l'Injecter l'attribut de tous les constructeurs que je veux utiliser pour l'injection. Cela semble vraiment comme un boiteux de conception? Dois-je créer un Noyau, puis l'utiliser partout où je passe à l'injection d'une classe?
Vous devez vous connecter pour publier un commentaire.
Pas que vous ne devriez pas le faire du tout, en fait. Puisque vous travaillez avec ASP.NET MVC, vous pouvez simplement installer le Ninject.MVC3 package Nuget. Cela vous aidera à démarrer avec un
NinjectMVC3
classe dans le App_Start dossier. Vous pouvez utiliser leRegisterServices
méthode pour enregistrer vos interfaces/classes avec Ninject. Tous les contrôleurs qui ont des dépendances de ces interfaces seront ensuite automatiquement résolus par Ninject, il n'est pas nécessaire pour l'Injecter de l'attribut.N' - ce que vous décrivez ressemble plus à la Localisateur de Service modèle, pas d'injection de dépendance - vous souhaitez passer dans vos dépendances, idéalement dans le constructeur, au lieu de les résoudre dans les classes en utilisant le noyau. Il devrait y avoir qu'une composition centrale de la racine où la résolution est faite, qui est à l'intérieur de la composition de la racine dans le
RegisterServices
méthode mentionnée ci-dessus ou d'un autre Ninject module instancié il - le plus tard approche vous permettra un peu plus de souplesse et de modularité (no pun intended) en changeant la façon dont vous résoudre vos dépendances.Voici un bon du débutant tutoriel sur l'injection de dépendance avec Ninject et MVC3.
WithConstructorArgument()
si les paramètres qui doivent être transmis sont résolus avec Ninject ainsi, considérez cela comme un grapheLa meilleure façon d'obtenir commencé avec Ninject est de commencer petit. Recherchez un
new
.Quelque part dans le milieu de votre application, vous êtes en train de créer une classe à l'intérieur d'une autre classe. Cela signifie que vous êtes en train de créer un dépendance. L'Injection de dépendance est d'environ passant ces dépendances, généralement par le constructeur, au lieu de intégration eux.
Dire que vous avez une classe comme ça, utilisée pour créer automatiquement un type spécifique de la note dans Word. (Ceci est similaire à un projet que j'ai fait récemment.)
WordDocumentCreator
est une classe qui gère les spécificités de la création d'un nouveau document dans Microsoft Word (créer une instance de Word, etc.). Ma classe,NoteCreator
, dépend surWordDocumentCreator
afin d'effectuer son travail.Le problème est que, si un jour nous décidons de passer à un supérieur de traitement de texte, je dois aller trouver tous les endroits où
WordDocumentCreator
est instancié et de les changer pour instancierWordPerfectDocumentCreator
à la place.Maintenant, imaginez que je change ma classe à ressembler à ceci:
Mon code n'a pas beaucoup changé; tout ce que j'ai fait dans le
Create
méthode est de supprimer la ligne avec lenew
. Mais maintenant, je suis l'injection de ma dépendance. Nous allons faire un petit changement:Au lieu de passer dans un béton
WordDocumentCreator
, j'ai extrait unIDocumentCreator
interface avec unCreateNewDocument
méthode. Maintenant, je peux passer en tout classe qui implémente cette interface, et tous lesNoteCreator
a à faire est d'appeler la méthode qu'il sait à ce sujet.Maintenant la partie la plus délicate. Je devrais maintenant avoir une erreur de compilation dans mon application, parce que quelque part j'ai été la création de
NoteCreator
avec un constructeur sans paramètre qui n'existe plus. Maintenant, j'ai besoin de sortir de que dépendance ainsi. En d'autres termes, je passe par la même processus que ci-dessus, mais maintenant je suis en l'appliquant à la classe qui crée une nouvelleNoteCreator
. Lorsque vous démarrez l'extraction des dépendances, vous verrez que ils ont tendance à "remonter" à la racine de votre application, ce qui est le seulement endroit où vous devriez avoir une référence à votre DI conteneur (par exemple, Ninject).L'autre chose que je dois faire est configurer Ninject. L'élément essentiel est une classe qui ressemble à ceci:
Cela dit Ninject que lorsque je tente de créer une classe qui, quelque part en bas de la ligne, il faut un
IDocumentCreator
, elle doit créer unWordDocumentCreator
et l'utiliser. Le processus Ninject traverse ressemble à quelque chose comme ceci:MainWindow
. Son constructeur exige uneNoteCreator
.IDocumentCreator
.IDocumentCreator
, je devrais utiliserWordDocumentCreator
. Afin de créer unWordDocumentCreator
.WordDocumentCreator
à la NoteCreator.NoteCreator
à laMainWindow
.La beauté de ce système est triple.
Tout d'abord, si vous ne parvenez pas à configurer quelque chose, vous saurez tout de suite, parce que vos objets sont créés dès que votre application est exécutée. Ninject vous donnera un message d'erreur utile de dire que votre
IDocumentCreator
(par exemple) ne peuvent pas être résolus.Deuxième, si la gestion ultérieure des mandats de l'utilisateur d'un supérieur de traitement de texte, tout ce que vous avez à faire est de
WordPerfectDocumentCreator
qui implémenteIDocumentCreator
.MyAppModule
ci-dessus, la liaisonIDocumentCreator
àWordPerfectDocumentCreator
à la place.Troisième, si je veux tester mon
NoteCreator
, je n'ai pas à passer dans un réelWordDocumentCreator
(ou ce que j'utilise). Je peux passer dans un faux un. De cette façon, je peux écrire un test qui suppose monIDocumentCreator
fonctionne correctement, et ne teste que les parties en mouvement deNoteCreator
lui-même. Mon fauxIDocumentCreator
ne rien faire, mais de retour à la réponse correcte, et mon test assurez-vous queNoteCreator
fait la bonne chose.Pour plus d'informations sur la façon de structurer vos applications de cette façon, avoir un coup d'oeil à la Marque de Seemann livre récent, L'Injection de dépendance dans la .NET. Malheureusement, elle ne couvre pas Ninject, mais il couvre un certain nombre d'autres DI cadres, et il parle de la façon de la structure de votre application dans la façon dont je l'ai décrit ci-dessus.
Également jeter un oeil à Travailler Efficacement Avec Le Code Existant, par Michael Plumes. Il parle de l'essai du côté de la ci-dessus: comment sortir d'interfaces et de passer du faux dans le but d'isoler le comportement et de le faire en vertu de test.
N'oubliez pas il y a des docs, y compris une intro, je me sens serait très approprié, étant donné le genre de questions que vous vous posez sur le Ninject Wiki. Vous êtes tout simplement ennuyeux de vous-même si vous essayez d'utiliser Ninject sans le lire de bout en bout.
Bâton de la table des matières sur votre barre de favoris pour un peu.
Je peux également vous recommandons fortement Marque Seemann's L'Injection de dépendance dans la .Net comme un livre d'accompagnement pour les DI en fonction de l'architecture (même si elle ne fait pas directement de couverture Ninject).