2011-02-05 9 views
9

Właśnie zacząłem grać ze strukturą Managed Extensibility. Mam wyeksportowaną klasę i instrukcję importu:MEF z ImportMany i 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;     
     } 
    } 

Działa to dobrze. IEnumerable pobiera wyeksportowane klasy. Nie staram się to zmienić, aby skorzystać z listy leniwy i zawierają metadane tak, że można odfiltrować klasę, że muszę sama eksportowej (jak poprzednio)

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

Po tym IEnumerable ma żadnych elementów. Podejrzewam, że gdzieś popełniłem oczywistą i głupią pomyłkę ..

+0

Jak wygląda twój interfejs metadanych? –

+0

Nie wiedziałem, że można wykonać ImportMany, w tym metadane. miły! – juFo

Odpowiedz

8

Prawdopodobnie nie pasuje, ponieważ twój interfejs metadanych nie pasuje do metadanych w eksporcie. Aby dopasować eksport przykładowy masz pokazane, twój interfejs metadane powinny wyglądać następująco:

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

Wiedziałem, że to było coś głupiego, po prostu nie mogłem tego zobaczyć. W moim interfejsie identyfikator był ciąg ... – Furnes

0

aby dodać metadane do klasy pochodnej od klasy, do której InheritedExport zostało zastosowane, należy zastosować ten sam atrybut InheritedExport także do klasy pochodnej. W przeciwnym razie metadane dodane do klasy pochodnej będą ukryte i niedostępne.

Innymi słowy, jeśli korzystasz z Lazy<T,TMetadata> w celu uzyskania dostępu do zastosowanych metadanych, a twoje importowanie nie jest wypełniane, może to oznaczać, że nie zastosowałeś InheritedExport do wszystkich swoich klas pochodnych.

Jeśli zamiast tego zastosujesz Export zamiast InheritedExport, otrzymasz kolejne wystąpienie swojej części.

Powiązane problemy