2012-07-20 31 views
5

Có bất kỳ cài đặt tệp cấu hình nào cho MEF hay mọi thứ được thực hiện trong mã không?Cấu hình MEF

Nếu mọi thứ đều có trong mã, một số phương pháp hay nhất để chuyển đổi giữa các lớp khác nhau xuất khẩu là gì? tức là nếu Class A và Class B đều xuất IMyExport, một số cách hay để "định cấu hình" ứng dụng để sử dụng A hoặc sử dụng B là gì?

Trả lời

7

Theo như tôi biết, MEF không có tệp cấu hình. Trong trường hợp bạn muốn ứng dụng của bạn sử dụng một triển khai trên một ứng dụng khác, bạn có thể tạo một tệp mới ConfigurationCatalog sẽ nhận tệp cấu hình làm đầu vào và sẽ chỉ xuất các phần mà nó cho nó biết. Có thể một cái gì đó như thế đã tồn tại trong MefContrib, vì vậy tôi sẽ kiểm tra ở đó.

Khác với điều đó, chính các lớp học tự quyết định triển khai nào họ muốn sử dụng. Một cách có thể để đạt được những gì bạn muốn là bằng cách sử dụng tên hợp đồng

[Export("My Contract Name", typeof(IMyExport))] 
public class A : IMyExport { } 

[Export("Another Contract Name", typeof(IMyExport))] 
public class B : IMyExport { } 

Sau đó, lớp nhập khẩu IMyExport có thể chỉ định các bộ phận nó muốn sử dụng

[Import("Another Contract Name")] 
public IMyExport MyExport { get; set; } 

Nếu bạn biết rằng sự phụ thuộc nhất định IMyExport có thể được xuất nhiều lần, bạn có thể add metadata to the export và quyết định thời gian chạy mà bạn muốn sử dụng theo siêu dữ liệu của nó. Nếu bạn đi theo hướng đó, mã của bạn sẽ trông giống như thế này

[MySpecialExport(SomeData = "ABC")] 
public class A : IMyExport { } 

[MySpecialExport(SomeData = "DEF")] 
public class B : IMyExport { } 

public class MyClass 
{ 
    [ImportMany(typeof(IMyExport))] 
    public IEnumerable<Lazy<IMyExport, IMyExportMetadata>> MyProperty { get; set; } 

    public void DoSomething() 
    { 
     var myLazyExport = MyProperty.FirstOrDefault(x => x.Metadata.SomeData == "DEF"); 
     IMyExport myExport = myLazyExport.Value; 

     // Do something with myExport 
    } 
}