2010-09-28 41 views
14

Tôi đang tạo một ứng dụng nhập nhiều plugin. Tôi cần khả năng thực hiện các hàm được triển khai trong mỗi plugin. Ví dụ, tôi cần phải làm một cái gì đó như thế này.Làm thế nào để xuất khẩu và nhập khẩu các chức năng và thực hiện chúng với 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; 
} 
///////////////////////////////////////////////////////////////////////////////// 

Vấn đề là tôi không chắc chắn cách xác định nhập & xuất và cách thực hiện chính xác chức năng.

Trả lời

18

Bạn có thể nhập các hàm dưới dạng ủy quyền Func <> hoặc Hành động <>, tùy thuộc vào chữ ký hàm. Đối với hàm đầu tiên, bạn có thể nhập nó vào IEnumerable<Lazy<Action>>. Cái thứ hai sẽ là IEnumerable<Lazy<Func<string, string>>>.

Bạn có thể muốn bao gồm tên hợp đồng để phân biệt giữa các hàm khác nhau có cùng chữ ký. Một xuất khẩu mẫu:

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

Và một nhập khẩu tương ứng:

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

Không nên bạn sử dụng ImportMany? '[ImportMany (" FunctionType ")]' – mnn

+0

@mnn Cảm ơn, tôi đã cập nhật mã –

Các vấn đề liên quan