2010-06-29 19 views
2

Je recherche MEF en tant que solution de résolution de plug-in dans notre application .NET existante.MEF Global CompositionContainer dans les applications existantes

Dans tous les exemples que je peux trouver, l'application principale crée une instance de CompositionContainer et appelle container.ComposeParts (this). Le problème est que mon application n'est pas entièrement construite sur MEF, donc il y a un trou dans le graphe d'objet où il n'y a pas de composants MEF. Donc, ma hiérarchie d'objets pourrait ressembler à ceci:

Application (MEF Container) -> ObjectB (pas MEF) -> ObjectA (nécessitant MEF importations)

Dans cette hiérarchie d'objets, il est impossible pour moi d'appeler container.ComposeParts (this) sur l'application et je m'attends à ce que l'application crée ObjectB et satisfasse les imports de ObjectA.

Est-ce une bonne pratique d'exposer globalement le conteneur CompositionConstant afin de pouvoir composer ObjectA plus tard que sur Application Startup ou dois-je restructurer toute l'application pour supporter un graphe d'objet MEF linéaire?

Répondre

2

Est-il une bonne pratique d'exposer la CompositionContainer globalement

Je ne dirais pas une bonne pratique, mais il est un compromis raisonnable quand il est impossible d'introduire l'inversion du principe de contrôle pour la construction partout. Parfois, la base de code existante n'est pas entièrement sous votre contrôle, ou un mélange complexe de .NET et de code natif (par exemple, des composants COM), ou simplement trop grand pour être refactorisé. Dans Silverlight, la construction d'objets à partir de XAML est également hors du contrôle de MEF, donc Microsoft a introduit essentiellement la même solution: le conteneur MEF par défaut est accessible comme un global et appelé avec PartInitializer.SatisfyImports(this);.

Notez que suivre ce modèle va serrer étroitement tous les consommateurs du global à MEF et la variable globale utilisée pour l'exposer. Il ne sera pas possible de réutiliser ce code tel quel dans d'autres applications ou avec d'autres conteneurs IoC. Cela compliquera également les tests unitaires.