2010-09-28 4 views
14

Ich erstelle eine Anwendung, die mehrere Plugins importiert. Ich brauche die Fähigkeit, Funktionen auszuführen, die in jedem der Plugins implementiert sind. Zum Beispiel muss ich so etwas tun.Wie exportiert und importiert man Funktionen und führt sie mit MEF aus?

///////////////////////////////////////////////////////////////////////////////// 
MainApp: 
[ImportMany(?)] 
public IEnumerable<Lazy<?>> PluginFunctions1 { get; set; } 

[ImportMany(?)] 
public IEnumerable<Lazy<?>> PluginFunctions2 { get; set; } 

foreach (f1 in PluginFunctions1) 
{ 
    f1(); // execute Function1 from each plugin 
} 

foreach (f2 in PluginFunctions2) 
{ 
    string result = f2(val); // execute Function2 from each plugin 
} 

///////////////////////////////////////////////////////////////////////////////// 
Plugin: 
[export(?)] 
public void Function1() 
{ 
} 

[export(?)] 
public string Function2(string value) 
{ 
    return result; 
} 
///////////////////////////////////////////////////////////////////////////////// 

Problem ist, dass ich nicht sicher bin, wie der Import & Export und wie definiert die Funktion genau auszuführen.

Antwort

18

Sie können die Funktionen als Func <> oder als Aktion <> Delegate importieren, abhängig von der Funktionssignatur. Für die erste Funktion könnten Sie sie in IEnumerable<Lazy<Action>> importieren. Die zweite wäre IEnumerable<Lazy<Func<string, string>>>.

Sie können einen Vertragsnamen hinzufügen, um zwischen verschiedenen Funktionen mit derselben Signatur zu unterscheiden. Eine Probe Export:

[Export("FunctionType")] 
public string Function(string value) 
{ 
    return value; 
} 

und ein entsprechender Import:

[ImportMany("FunctionType")] 
public IEnumerable<Lazy<Func<string, string>>> ImportedFunctions { get; set; } 
+0

Sollten Sie nicht ImportMany verwenden? '[ImportMany (" FunctionType ")]' – mnn

+0

@mnn Danke, ich habe den Code aktualisiert –

Verwandte Themen