2011-02-05 11 views
9

Ho appena iniziato a giocare con il framework Extensibility gestito. Ho una classe esportata e una dichiarazione di importazione:MEF con ImportMany e 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;     
     } 
    } 

Questo funziona bene. IEnumerable ottiene le classi esportate. Non provo a cambiare questa opzione per utilizzare la lista pigro e comprendono i metadati in modo che possa filtrare la classe che ho bisogno (stessa esportazione come prima)

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

Dopo questo l'IEnumerable non ha elementi. Sospetto di aver fatto un errore ovvio e stupido da qualche parte ..

+0

Che aspetto ha l'interfaccia dei metadati? –

+0

Non sapevo che potessi fare un ImportMany compresi i metadati. simpatico! – juFo

risposta

8

Probabilmente non corrisponde perché l'interfaccia dei metadati non corrisponde ai metadati sull'esportazione. Per abbinare l'esportazione campione che hai mostrato, l'interfaccia metadati dovrebbe essere simile a questo:

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

Sapevo che era qualcosa di stupido, semplicemente non potevo vederlo. Nella mia interfaccia l'ID era una stringa ... – Furnes

0

Per aggiungere i metadati a una classe derivata da una classe a cui InheritedExport è stato applicato, è necessario applicare lo stesso attributo InheritedExport anche alla classe derivata. In caso contrario, i metadati aggiunti alla classe derivata saranno nascosti e non disponibili.

In altre parole, se si utilizza Lazy<T,TMetadata> per accedere ai metadati applicati e le importazioni non vengono popolate, potrebbe significare che non si è applicato InheritedExport a tutte le classi derivate.

Se si applica invece Export anziché InheritedExport, si arriverà a un'altra istanza della parte.