Tôi không hiểu MEF rất tốt, vì vậy hy vọng đây là một cách khắc phục đơn giản về cách tôi nghĩ nó hoạt động.MEF GetExports <T, TMetaDataView> không trả lại gì với AllowMultiple = True
Tôi đang cố gắng sử dụng MEF để nhận một số thông tin về một lớp học và cách sử dụng nó. Tôi đang sử dụng các tùy chọn Siêu dữ liệu để cố gắng đạt được điều này. giao diện và thuộc tính của tôi trông như thế này:
public interface IMyInterface
{
}
public interface IMyInterfaceInfo
{
Type SomeProperty1 { get; }
double SomeProperty2 { get; }
string SomeProperty3 { get; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ExportMyInterfaceAttribute : ExportAttribute, IMyInterfaceInfo
{
public ExportMyInterfaceAttribute(Type someProperty1, double someProperty2, string someProperty3)
: base(typeof(IMyInterface))
{
SomeProperty1 = someProperty1;
SomeProperty2 = someProperty2;
SomeProperty3 = someProperty3;
}
public Type SomeProperty1 { get; set; }
public double SomeProperty2 { get; set; }
public string SomeProperty3 { get; set; }
}
Lớp được trang trí với các thuộc tính như sau:
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}
Phương pháp mà đang cố gắng sử dụng nhập khẩu như sau:
private void SomeFunction()
{
// CompositionContainer is an instance of CompositionContainer
var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}
Trong trường hợp của tôi myExports
luôn trống. Trong CompositionContainer của tôi, tôi có một phần trong danh mục của tôi có hai ExportDefinitions
, cả hai đều có ContractName
: "MyNamespace.IMyInterface" sau đây. Metadata
cũng được tải chính xác cho mỗi lần xuất của tôi.
Nếu tôi xóa thiết lập AllowMultiple
và chỉ bao gồm một thuộc tính đã xuất, biến số myExports
hiện có một lần xuất với siêu dữ liệu đã tải của nó.
Tôi đang làm gì sai?
EDIT: Nếu tôi sử dụng yếu gõ Metadata, xuất khẩu của tôi là bất ngờ hài lòng:
var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();
Bất cứ ý tưởng tại sao?
Yep, đó là những gì tôi đã kết thúc làm, sau khi đọc bài viết sau đây: http://blogs.microsoft.co. il/blogs/bnaya/archive/2010/01/29/mef-cho-beginner-repeatable-metadata-part-9.aspx Tôi sẽ đăng bài này ngày hôm qua nhưng đã bị kéo vào những thứ khác trước khi tôi có thể kết thúc để tận hưởng điểm của bạn ! – sohum
Không cần phải tạo lớp kế thừa từ 'Thuộc tính' thay vì' ExportAttribute'. Điểm của 'MetadataAttributeAttribute' là ngắn gọn và concision ;-).Chỉ cần sử dụng chế độ xem siêu dữ liệu tùy chỉnh và xử lý thủ công các mảng hoạt động cho tôi. Nó không phải là rõ ràng từ các tài liệu mà 'AllowMultiple' gây ra các mục siêu dữ liệu để trở thành mảng, rất lạ… – binki