2017-10-07 9 views
2

Je crois que le ImportAttribute ou ImportManyAttribute en coulisses devrait utiliser certaines méthodes de base de MEF pour obtenir les métadonnées exportées jumelées avec l'instance réelle du type exporté. L'utilisation de ces attributs fonctionne très bien avec la configuration suivante:Obtenir des métadonnées exportées sans utiliser ImportAttribute ou ImportManyAttribute dans MEF?

//the metadata interface 
public interface IMetadata { 
    string Name {get;} 
} 
//the custom ExportAttribute 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
[MetadataAttribute] 
public class CustomExportAttribute : ExportAttribute, IMetadata { 

    public string Name {get;set;} 
} 
//the class which need to be exported (both value and metadata) 
[CustomExport(Name = "someName")] 
public class A { 
} 
//the class which imports the exported value and metadata 
[Export] 
public class B { 
    [Import] 
    public Lazy<A, IMetadata> AData {get;set;} 
} 

maintenant lors de l'obtention de la valeur exportée de B, je peux parcourir le AData avec l'instance correctement exportée A et ses métadonnées associées via IMetadata interface, comme ceci:

Cependant, je ne veux pas utiliser la classe B dans ce cas, comment puis-je obtenir la paire exportée de A et ses métadonnées? Parce que n'utilisant aucune classe (comme B), l'attribut ImportAttribute n'est également pas utilisé dans ce cas. Voici ce que j'ai essayé:

var ac = new AggregateCatalog(); 
ac.Catalogs.Add(new DirectoryCatalog(".")); 
var c = new CompositionContainer(ac); 
var a = c.GetExportedValue<Lazy<A,IMetadata>>(); 

La dernière ligne lancers francs au-dessus de l'exception ImportCardinalityMismatchException, comme ceci:

Aucune exportation n'a été trouvé qui correspondent à la contrainte: ContractName System.Lazy (Test. A, Test.IMetadata) RequiredTypeIdentity System.Lazy (Test.A, Test.IMetadata)

Je crois qu'il doit y avoir un moyen d'obtenir la valeur exportée (paire de l'instance de type et ses métadonnées) sans utiliser une classe fictive dans laquelle le ImportAttribute est utilisé pour stocker la valeur exportée dans une propriété de cette classe.

S'il vous plaît aidez-moi avec ce problème, je suis toujours en train de commencer avec MEF et Prism. Merci de votre aide!

Répondre

1

Il y a un moyen en effet! Pas besoin d'importer l'export dans une autre classe. Utilisez simplement la méthode GetExport < T, TMetadataView>. Sur la base de votre code je l'ai fait travailler seulement en ajoutant:

var wow = c.GetExport<A, IMetadata>(); 

Cela renvoie exactement ce que vous voulez, un Lazy < T, TMetadataView>

Hope this helps!

+0

Eh bien, c'est un peu caché, ça aide vraiment, merci. Le problème auquel je tenais a été loin car je suis maintenant impliqué dans d'autres problèmes, je ne l'ai pas encore testé mais je crois que ça devrait marcher! – Hopeless