2010-08-26 10 views
1

J'essaie de réajuster (mauvaise idée je sais, mais mieux vaut tard que jamais) IOC et DI dans une solution existante.IOC à travers des projets de studios visuels?

La base de code est constituée d'environ 30 projets, chacun ayant des classes qui ont peu ou pas de visibilité sur le monde extérieur. Étant relativement nouveau à la chose IOC j'essaie d'utiliser les meilleures pratiques lors du remaniement du code, et il semble préférable de ne pas passer le conteneur IOC ou le rendre statique, d'où je tente de tout faire via injection de constructeur.

Cependant, et voici ma question, je dois faire énormément de classes publiques à travers les projets (c'est-à-dire les fichiers physiques .csproj). Je dois le faire parce que mon 'module de configuration' (j'utilise Ninject, mais c'est une question agnostique du CIO) a besoin de savoir tout sur n'importe quelle classe dans n'importe quel projet afin de pouvoir résoudre les dépendances.

Ai-je manqué quelque chose d'important? Est-ce que toutes mes classes sont censées être publiques si elles sont basées sur une interface? Puis-je en quelque sorte créer un conteneur IOC pour chacune de mes limites csproj et que faire l'injection pour moi?

Ta

Répondre

2

Ne pourriez-vous pas écrire un module de configuration à l'intérieur de chaque projet, et ne le rendre public? Ensuite, configurez ninject avec tous les modules au lieu d'un seul ...

+2

Pour: Encapsulation. Inconvénients: Chaque module a maintenant une dépendance sur Ninject; la configuration peut être plus rigide (et si le consommateur A veut IFoo être implémenté par Bar au lieu de Foo?); pas un seul endroit pour voir toutes les cartographies. – TrueWill

1

Je crois que vous êtes sur la bonne voie. En général, tout conteneur de l'IoC doit être conscient (a) de l'interface et (b) de l'implémentation pour pouvoir tout câbler. Vous effectuez généralement le "câblage" dans des modules de niveau supérieur (votre projet de module de configuration dans ce cas); les modules de niveau inférieur n'ont pas besoin de connaître toutes les implémentations possibles des interfaces. Pour que cela se produise (et pour faciliter la testabilité), les implémentations doivent être publiques.

Si vous vouliez vraiment vous pourriez utiliser InternalsVisibleTo, mais je ne le ferais pas. Si vous n'utilisiez pas IoC, vous auriez besoin de rendre ces classes publiques de toute façon.

Vous pouvez également regarder dans MEF; apparemment it allows the implementations to be private or internal.