2013-12-08 16 views
6

Tôi đang sử dụng MEF và tôi có hai xuất khẩu có cùng loại hợp đồng nhưng với tên hợp đồng khác nhauService Locator: Nhận tất cả xuất khẩu

Ví dụ:

[Export("TypeA", typeof(MyPlugin))] 
[Export("TypeB", typeof(MyPlugin))] 

tôi có thể lấy từng xuất khẩu sử dụng tên hợp đồng tương ứng:

ServiceLocator.GetExportedValues<MyPlugin>("TypeA"); 

Nhưng bây giờ tôi muốn truy xuất tất cả các trường hợp triển khai MyPlugin. có cách nào tôi có thể làm được không?

Tôi đã thử bằng cách sử dụng đoạn mã sau:

ServiceLocator.GetExportedValues<MyPlugin>(); 

Nhưng nó đã không làm việc. Rõ ràng nó được sử dụng để truy xuất các bản triển khai không có tên hợp đồng cụ thể.

Bất kỳ ý kiến ​​nào?

Trả lời

4

tôi chỉ cần thêm một xuất khẩu không tên bên cạnh mỗi tên xuất khẩu nếu bạn muốn nó được phân giải cả hai cách. Ví dụ

// named and nameless 
[Export("TypeA", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

// named nameless, again 
[Export("TypeB", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

class MyPlugin { } 


[TestMethod] 
public void mef() 
{ 
    var catalog = new AssemblyCatalog(this.GetType().Assembly); 
    var container = new CompositionContainer(catalog); 

    Assert.AreEqual(2, container.GetExportedValues<MyPlugin>().Count()); 
} 
0

Bạn có thể sử dụng xuất siêu dữ liệu được nhập mạnh mẽ.

  1. Tạo thuộc tính tùy chỉnh được kế thừa từ ExportAttribute, được triển khai từ giao diện.
  2. Sử dụng thuộc tính tùy chỉnh này thay vì Xuất.

Bạn có thể sử dụng Nhập để nhận loại được yêu cầu.

[ImportMany] 
public IEnumerable<Lazy<YourType,IMetadataAttribute>> Plugins{get;private set;} 

Bạn có thể nhận biết thêm thông tin từ MEF Documentation

0

Khai báo cả hai loại Export

[Export(typeof(IFoo)),Export("TypeA", typeof(IFoo))] 
public class Foo1 : IFoo { } 

[Export(typeof(IFoo)),Export("TypeB", typeof(IFoo))] 
public class Foo2 : IFoo { } 

Và nhập chúng bằng cách sử ImportMany

[ImportMany] 
IFoo[] foos; 
+1

như thế nào này trả lời bất kỳ khác với @ default.kramer không? –

+0

Tuyên bố là như nhau, nhưng tôi cũng cho bạn thấy làm thế nào bạn có thể có Mef tiêm tất cả các trường hợp mà không cần phải tham khảo các container/catalog trực tiếp ... đó là cách thích hợp làm thế nào người ta nên sử dụng một khuôn khổ DI. –

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