2010-11-10 5 views
1

En utilisant MEF, de l'intérieur de l'exportateur, est-il possible de savoir qui est l'importateur en utilisant les métadonnées?Automatiquement distinguer l'appelant dans MEF

par exemple, est-ce possible:

[Export("Config")] 
String Config() 
{ 
    if (importer.metedata["name"] == "Circle") 
    return "R=10"; 
} 

Cet importateur de façon n'a pas besoin de passer quelque chose (son nom, ici) pour dire l'exportateur qui est-il.

Répondre

1

Non, vous ne pouvez pas faire cela. Il est plus logique de le faire:

[Export("Config")] 
string GetConfigurationValue(string name) 
{ 
    if (name == "Circle") 
    { 
     return "R=10"; 
    } 
    throw new ArgumentException(
     string.Format("Unknown configuration value '{0}'", name)); 
} 

Et la classe qui importe cette méthode pourrait ressembler à ceci:

[Export(typeof(IDrawer))] 
public class CircleDrawer : IDrawer 
{ 
    [Import("Config")] 
    public Func<string,string> ConfigGetter { get; set; } 

    public void Draw() 
    { 
     string configuration = this.ConfigGetter("Circle"); 
     ... 
    } 
} 

Notez que l'importation directe et les méthodes d'exportation (comme System.Action ou System.Func) est rapide et sale.

Il est préférable de déclarer une interface IConfigurationProvider à la place et d'exporter cela au niveau de la classe. Ceci a deux avantages:

  • La documentation d'interface est l'endroit où vous pouvez documenter le contrat sur lequel l'importateur et l'exportateur doivent s'entendre.
  • il élimine les besoins pour ces chaînes embêtantes dans les attributs d'importation/exportation en les remplaçant par typeof(IConfigurationProvider).
+0

Cela devrait fonctionner, mais n'avez-vous pas besoin d'un attribut 'Import' correspondant sur le paramètre' name'? Sinon, comment pourrait-il savoir quelle valeur devrait être transmise? – casperOne

+0

@casperOne: Non. Ce qui est exporté ici est un 'System.Func '. J'ai ajouté un exemple de la classe d'importation pour clarifier les choses. –

+0

J'y ai pensé mais c'est contre le découplage. Je préfère passer la config dans le cadre du contrat si ça ne se fait pas automatiquement. De cette façon, l'exportateur sait qui importe, mais c'est contre IoC pour le moment. – Xaqron