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
}
}
Nguồn
2012-07-20 19:50:13