2011-02-05 55 views
9

我剛剛開始使用Managed Extensibility框架。我有一個導出的類和一個導入語句:帶有ImportMany和ExportMetadata的MEF

[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;     
     } 
    } 

這工作得很好。 IEnumerable獲取導出的類。不,我試圖改變這種使用懶列表,包括元數據,以便我可以篩選出我需要的類(相同的出口如前)

[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; 
     }    
    } 

這個了IEnumerable沒有元素之後。我懷疑我在某個地方犯了一個明顯而愚蠢的錯誤..

+0

你的元數據接口是什麼樣的? – 2011-02-05 23:36:56

+0

不知道你可以做一個ImportMany包括元數據。太好了! – juFo 2012-07-17 21:14:44

回答

8

它可能不匹配,因爲你的元數據接口不匹配導出的元數據。爲了配合還有你的樣品出口,元數據接口應該是這樣的:

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

添加元數據從一個類派生的類到InheritedExport得到了應用,還必須採用同樣的InheritedExport屬性到派生類。否則,添加到派生類的metdata將被隱藏並且不可用。

換句話說,如果您使用Lazy<T,TMetadata>來訪問應用的元數據,並且您的導入沒有被填充,這可能意味着您沒有將InheritedExport應用於所有派生類。

如果您改爲使用Export而不是InheritedExport,那麼您將最終得到您的零件的另一個實例。