2010-09-28 13 views
14

Birkaç eklentiyi içe aktaran bir uygulama oluşturuyorum. Eklentilerin her birinde uygulanan işlevleri yürütme yeteneğine ihtiyacım var. Mesela böyle bir şey yapmalıyım.Fonksiyonlar nasıl dışa aktarılır ve içe aktarılır ve MEF ile nasıl uygulanır?

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

Sorun ithalat & ihracat ve tam olarak nasıl işlevi gerçekleştirmek için nasıl tanımlanacağı emin değilim olmasıdır.

cevap

18

İşlev imzasına bağlı olarak, işlevleri Func <> veya Eylem <> temsilci olarak içe aktarabilirsiniz. İlk işlev için onu IEnumerable<Lazy<Action>>'a aktarabilirsiniz. İkincisi IEnumerable<Lazy<Func<string, string>>> olacaktır.

Aynı imzaya sahip farklı işlevler arasında ayrım yapmak için bir sözleşme adı eklemek isteyebilirsiniz. Örnek bir ihracat:

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

Ve karşılık gelen bir ithalat: Eğer ImportMany kullanmak gerekmiyor

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

? '[ImportMany (" FunctionType ")]' – mnn

+0

@mnn Teşekkürler, kodu güncelledim –