2009-11-04 7 views
9

Je crée une petite application C#, qui consiste actuellement en un assemblage de noyau et un assemblage de winforms. Je me rends compte que je n'ai probablement pas vraiment besoin de Ninject dans une petite chose comme ça, mais je voudrais l'essayer.C#, Ninject: Où mettez-vous le noyau et vos modules?

Quoi qu'il en soit, pour travailler avec Ninject J'ai compris que vous écririez un ensemble de modules, quelle carte est retournée, et ainsi de suite. Après cela, vous créez une instance de IKernel et chargez vos modules dans celui-ci.

Mais, où puis-je conserver ces modules? Et où puis-je garder le noyau? Où vont les choses?

Répondre

3

Vous pouvez créer une classe de wrapper statique pour le noyau. De cette façon, vous pourriez faire quelque chose comme ServiceLocator.Resolve()

Pour l'enregistrement de services, il existe deux façons: en ligne et l'inscription du module. Les deux devraient être chargés au démarrage. Le module est meilleur pour l'organisation.

Il serait peut-être plus simple de commencer avec StructureMap car il existe une classe statique et des fonctions de mappage automatique.

Ces screencasts vous devriez commencer:

3

+ réponse de Marek 1'd - vraiment regarder à travers ces ressources.

Quelques points ...

Vous êtes certainement le droit d'essayer cela, même dans une petite application. Il est également important de réfléchir sérieusement à des questions superficiellement simples comme celle que vous avez posée. Pour DI, il faut vraiment travailler avec ça pour vraiment l'apprécier. Pour ma part, j'étais dans le camp «Oh, je n'ai qu'une petite application» (déni) pendant longtemps jusqu'à ce que je l'utilise .

Il y a une école de ce que l'on devrait en général éloigner du Localisateur de Service et avoir juste l'injection [sans aucune dépendance sur un conteneur].

Si vous n'utilisez pas les localisateurs de service, personne n'a besoin de savoir où se trouve le conteneur (noyau), ce qui est la meilleure solution.

Les modules servent principalement à compartimentaliser des lots de choses à enregistrer dans un conteneur global particulier (noyau).

Il existe certainement une implémentation canonique 'Global Container' Singleton pour Ninject? EDIT: Il suffit de trouver un: - http://www.codethinked.com/creating-a-binding-factory-for-ninject

Voir aussi Ninject: How do I inject into a class library?

+0

Je cherchais simplement une façon canonique de le faire et je me suis dit "génial!" quand je t'ai vu en lier un. Mauvaise nouvelle, ce code est TERRIFICALLY UNTHREADSAFE. Si je devrais enrouler le noyau dans un singleton, je peux le faire moi-même de manière sûre (indice, constructeur statique) mais être prévenu tous ceux qui viendront ici dans le futur: Cet article de liens est à une implémentation complètement non thread-safe. –

+0

@JimmyHoffa Je suis d'accord qu'il n'est pas threadsafe (suggère d'appliquer une approche de votre choix de http://csharpindepth.com/articles/general/singleton.aspx). Cependant, mieux vaut aller avec le point principal de ma réponse, qui est d'avoir une racine de composition qui a un endroit clair où l'initialisation peut avoir lieu pour prendre le besoin de sécurité de ce fil (parmi d'autres questions) hors de l'image complètement. –

+0

Je ne connais pas votre racine de composition, mais sans accès au noyau, comment demandez-vous les objets dont vous voulez que le constructeur soit injecté? dans votre interface utilisateur, vous voulez accéder à votre 'UserManager' qui prend un' IUserRepository' à la construction; Comment obtenez-vous ce 'UserManager' sans accès au noyau (via quelque chose comme un localisateur de service)? Vous ne pouvez pas juste 'new UserManager (???);' et vous attendre à ce que la bonne chose soit transmise à son constructeur? –

0

Mon point de vue: comme l'a dit Marek, vous devez créer une enveloppe (probablement statique) pour le noyau, qui contient l'instance IKernel. Il devrait contenir la méthode Resolve < T>, et probablement la méthode Load (module INinjectModule) - tout statique.

Dans chaque assemblage, vous pouvez simplement définir votre propre INinjectModule qui mappe des classes dans cet assemblage.L'encapsuleur du noyau se trouve dans l'assemblage le plus bas, le plus commun (généralement celui où se trouvent Log et Utils). C'est parce que le noyau doit être accessible de toutes les parties - il doit donc être dans l'assemblage, qui est référencé par tous les autres. Si vous n'en avez pas, vous êtes toujours assez libre pour en créer un. Cela peut sembler un peu délicat, on pourrait s'attendre à ce que le noyau soit dans l'assemblage le plus haut (l'exécutable). Pas vrai.

Pour enregistrer tous vos modules depuis vos assemblys, appelez simplement Kernel.Load (nouveau XXModule) dans chacun d'entre eux.

Questions connexes