2011-07-13 5 views
1

Depuis le MEF documentation officiel:MEF: "Une partie Composable doit contenir au moins un EXPORT"

Une partie Composable doit contenir au moins une exportation.
Les pièces composables sont soit ajoutées à l'explicitation du conteneur, soit créées à l'aide de catalogues.
Les catalogues par défaut fournis par MEF identifient les pièces composables en présence d'un attribut d'exportation.

Est-ce que cela signifie que cet extrait forment la même documentation ne fonctionnerait pas, lorsque vous utilisez les catalogues par défaut, car il ne exportation quoi que ce soit?

class Program 
{ 
    [Import] 
    public IMessageSender MessageSender { get; set; } 
} 

Je trouve difficile de croire que toutes les classes participant au mélange MEF, doivent tous « apporter de la nourriture à la table », même s'ils veulent juste pour « consommer ».
Le Program ci-dessus est un exemple simple: il n'y a rien que cette classe pourrait ajouter au mélange MEF.

En second lieu,
Comment les parties étant ajouté « explicitement au conteneur »?
La documentation de par ex. CompositionContainer ne m'aide pas plus loin.

Merci à l'avance Jan

Répondre

2

Une partie composable est une partie qui peut être importé dans une autre partie. L'exemple ici:

class Program 
{ 
    [Import] 
    public IMessageSender MessageSender { get; set; } 
} 

Program ne fait pas partie composable. Il n'est pas automatiquement importé dans une autre partie. Vos exportations pour IMessageSender sont des pièces composables.

Vous pouvez ajouter des pièces explicity au récipient en utilisant un CompositionBatch, ce qui vous permet d'ajouter Export et ComposablePart cas à votre conteneur explicitement, ou par extension, vous pouvez ajouter des valeurs brutes:

var user = new User() { Name = "Matt" }; 
var batch = new CompositionBatch(); 
batch.AddExportedValue(user); 

CompositionContainer.Compose(batch); 

Lorsque le dernier appel est l'ajout de vos pièces dans le conteneur.

0

dans votre exemple, le programme devrait appeler container.SatisfyImports(); pour être en mesure de récupérer le IMessageSender.

De plus, vous pouvez utiliser une exportation héritée sur l'interface, de sorte que tout ce qui implémente cette interface est automatiquement exporté.

[InheritedExport] 
public interface IMessageSender 
{ 
} 

Voir mon code ici: MEFMVVMCS.zip

Questions connexes