2009-09-18 3 views
2

Je suis nouveau à MEF et j'essaie de l'utiliser pour construire un système de plug-in, mais je suis bloqué à la première étape.Comment importer plusieurs plugins/parties en utilisant MEF?

Je suis un article by Andrew Whitechapel. J'ai téléchargé son exemple de code et il fonctionne correctement (si vous supprimez l'un des assemblages "exportant" - ils sont mutuellement exclusifs dans son échantillon - et référence l'assembly MEF).

L'exemple illustre l'importation d'une pièce unique. Je veux importer plusieurs parties (toutes basées sur la même interface). Alors, je change l'exemple de code comme suit:

[Import] 
// OLD - public Interface.ICalculate Calculate { get; set; } 
public IEnumerable<Interface.ICalculate> Calculators { get; set; } 

// OLD - Console.WriteLine(
// OLD -  String.Format("{0}", Calculate.Circumference(4))); 
foreach (Interface.ICalculate calculator in Calculators) 
{ 
    Console.WriteLine(
    String.Format("{0}", calculator.Circumference(4))); 
} 

J'importaient aussi System.Collections.Generic pour le IEnumerable.

Le changement de clé est le premier. Si je comprends bien, cela me permettra d'importer des pièces provenant de plusieurs assemblages. Cependant, j'obtiens l'erreur suivante:

No valid exports were found that match the constraint 

À ce stade, je n'ai même pas ajouté plusieurs assemblages de "plugin". Toujours juste l'un.

Pour être complet est ici sa définition d'exportation (que je ne l'ai pas touché) dans la bibliothèque de classes « plug-in »:

[Export(typeof(Interface.ICalculate))] 
public class Calculate : Interface.ICalculate 

Toutes les idées? Je me gratte la tête ici. J'ai cherché SO et les forums MEF, mais je pouvais trouver quelque chose pour m'éclairer.

J'utilise VS 2008 SP1 (aucune version bêta installée en 2010) et le tout dernier ensemble System.ComponentModel.Composition (2009.26.8.0).

Répondre

5

La version 5 de MEF Preview a changé cela. Vous devez maintenant utiliser ImportManyAttribute au lieu de ImportAttribute:

[ImportMany] 
public IEnumerable<Intertface.ICalculate> Calculators { get; set; } 

Pour plus de détails, voir le announcement for PR5.

Questions connexes