2011-02-05 27 views
9

Tôi vừa mới bắt đầu chơi xung quanh với khung công tác Mở rộng được quản lý. Tôi có một lớp được xuất và một câu lệnh nhập:MEF với ImportMany và ExportMetadata

[Export(typeof(IMapViewModel))] 
[ExportMetadata("ID",1)] 
public class MapViewModel : ViewModelBase, IMapViewModel 
{ 
} 

    [ImportMany(typeof(IMapViewModel))] 
    private IEnumerable<IMapViewModel> maps; 

    private void InitMapView() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(ZoneDetailsViewModel).Assembly)); 
     CompositionContainer container = new CompositionContainer(catalog); 

     container.ComposeParts(this); 
     foreach (IMapViewModel item in maps) 
     { 
      MapView = (MapViewModel)item;     
     } 
    } 

Điều này chỉ hoạt động tốt. IEnumerable có được các lớp được xuất khẩu. Không, tôi cố gắng để thay đổi điều này để sử dụng danh sách Lazy và bao gồm các siêu dữ liệu để tôi có thể lọc ra các lớp học mà tôi cần (giống xuất khẩu như trước đây)

[ImportMany(typeof(IMapViewModel))] 
    private IEnumerable<Lazy<IMapViewModel,IMapMetaData>> maps; 

    private void InitMapView() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(ZoneDetailsViewModel).Assembly)); 
     CompositionContainer container = new CompositionContainer(catalog); 

     container.ComposeParts(this); 
     foreach (Lazy<IMapViewModel,IMapMetaData> item in maps) 
     { 
      MapView = (MapViewModel)item.Value; 
     }    
    } 

Sau này IEnumerable không có yếu tố này. Tôi nghi ngờ rằng tôi đã tạo ra một sai lầm rõ ràng và ngu ngốc ở một nơi nào đó ..

+0

Giao diện siêu dữ liệu của bạn trông như thế nào? –

+0

Bạn không biết bạn có thể làm một ImportMany bao gồm siêu dữ liệu. tốt đẹp! – juFo

Trả lời

8

Có thể không khớp vì giao diện siêu dữ liệu của bạn không khớp với siêu dữ liệu khi xuất. Để phù hợp với việc xuất khẩu mẫu mà bạn đã hiển thị, giao diện siêu dữ liệu của bạn sẽ giống như thế này:

public interface IMapMetaData 
{ 
    int ID { get; } 
} 
+0

Tôi biết đó là điều ngu ngốc, chỉ không thể nhìn thấy nó. Trong giao diện của tôi ID là chuỗi ... – Furnes

0

Để thêm siêu dữ liệu đến một lớp học có nguồn gốc từ một lớp học mà InheritedExport đã được áp dụng, bạn phải áp dụng cùng InheritedExport thuộc tính cũng đến lớp dẫn xuất. Nếu không, metdata được thêm vào lớp dẫn xuất sẽ bị ẩn và không có sẵn.

Nói cách khác, nếu bạn đang sử dụng Lazy<T,TMetadata> để truy cập siêu dữ liệu được áp dụng và nhập của bạn không được phổ biến, điều đó có nghĩa là bạn không áp dụng InheritedExport cho tất cả các lớp học có nguồn gốc của bạn.

Nếu bạn thay vì áp dụng Export thay vì InheritedExport, bạn sẽ kết thúc bằng một phiên bản khác của bộ phận của bạn.