2010-09-28 78 views
14

我正在創建一個導入多個插件的應用程序。我需要能夠執行在每個插件中實現的函數。例如,我需要做這樣的事情。如何導出和導入函數並使用MEF執行它們?

///////////////////////////////////////////////////////////////////////////////// 
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; 
} 
///////////////////////////////////////////////////////////////////////////////// 

問題是,我不知道如何定義導入&出口和如何準確執行功能。

回答

18

您可以根據功能簽名將功能導入爲Func <>或操作<>委託。對於第一個功能,您可以將其導入IEnumerable<Lazy<Action>>。第二個將是IEnumerable<Lazy<Func<string, string>>>

您可能希望包含合同名稱以區分具有相同簽名的不同功能。樣本出口:

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

和相應的進口:

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

你不應該使用ImportMany? '[ImportMany(「FunctionType」)]' – mnn 2013-02-18 22:54:57

+0

@mnn謝謝,我更新了代碼 – 2013-02-21 18:49:35