2010-08-10 15 views
1

Je ne le fais vraiment pas fonctionner.MEF - Comment puis-je utiliser un ExportProvider pour sélectionner un seul Export

disons que j'ai quelques classes avec la même interface que je veux exporter.

[Export(typeof(IService))] 
[ExportMetadata("ExportType", typeof(Service1))] 
public class Service1 : IService 
{...} 
[Export(typeof(IService))] 
[ExportMetadata("ExportType", typeof(Service2))] 
public class Service2 : IService 
{...} 
[Export(typeof(IService))] 
[ExportMetadata("ExportType", typeof(Service3))] 
public class Service3 : IService 
{...} 

maintenant j'ai une classe qui importe le service IS et cette classe n'a pas d'importance quel service il est. Ce que j'essaye de réaliser maintenant est de construire un ExportProvider qui sélectionne le bon Export sur Composer.

Quelque chose comme ceci:

public TypeExportProvider<TTypeToExport>() : ExportProvider 
{} 

je ne sais vraiment pas comment le

protected override IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition) 

devrait ressembler. peut-être que quelqu'un connaît un blog à lire à ce sujet. il y a beaucoup d'échantillons exportProvider personnalisés mais pas pour cette situation.

thx

Répondre

2

Salut Kent si vous regardez les exportations, il y a des métadonnées appelées « ExportType », cela devrait être le sélecteur pour le exportprovider personnalisé. mais après avoir posté ici a trouvé un billet de blog de glenn block. donc mon but spécial que je dois faire est la suivante:

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var defaults = new CatalogExportProvider(new TypeCatalog(typeof(Service2))); 
var container = new CompositionContainer(catalog, defaults); 
defaults.SourceProvider = container; 

jamais moins il serait agréable de voir comment puis-je écrire un exportprovider personnalisé qui sélectionnent l'exportation directement à partir des métadonnées. mon problème est de savoir comment choisir la bonne information de ImportDefnition et comment pourrais-je définir la nouvelle exportation (...) dans GetExportsCore().

+0

marqué comme réponse car il résout mon problème. – blindmeis

+0

Si je comprends votre question, j'ai un problème similaire ici: http://stackoverflow.com/questions/9626227/how-to-manage-discovery-and-composition-as-2-separate-concerns Dans mon cas particulier , Je veux interroger pour une exportation lorsque certains paramètres d'entrée sont fournis pour le paramètre constructeur à injecter. – IAbstract

0

Ce MSDN Magazine article explique comment récupérer et utiliser les métadonnées d'exportation. Essentiellement, vous utilisez la méthode GetExports() sur CompositionContainer pour obtenir les types et les métadonnées, ce qui vous permet ensuite de sélectionner le type en fonction des valeurs de métadonnées.

+0

en utilisant des métadonnées pour les importations tout en utilisant paresseux <> n'est pas le problème. Ma question est comment puis-je traiter la composition de mef (ExportProvider) pour sélectionner simplement l'exportation ONE alors qu'il existe de nombreuses exportations pour satisfaire mon ExatlyOneImport. – blindmeis

+0

Cela dépend de vos critères de sélection d'une exportation. GetExports(). First() ou utilisez une requête LINQ sur le résultat de GetExports(). – Rich257