2011-02-05 23 views
9

Acabo de empezar a jugar con el marco de Extensibilidad administrada. Tengo una clase que se exporta y una declaración de importación:MEF con ImportMany y 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;     
     } 
    } 

Esto funciona bien. El IEnumerable obtiene las clases exportadas. No trato de cambiar esta opción para utilizar la lista perezoso e incluir los metadatos para que pueda filtrar la clase que necesito (el mismo que antes de exportación)

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

Después de esto el IEnumerable no tiene elementos. Sospecho que cometí un error obvio y estúpido en alguna parte ...

+0

¿Cómo es la interfaz de metadatos? –

+0

No sabía que podía hacer un ImportMany incluyendo los metadatos. ¡bonito! – juFo

Respuesta

8

Probablemente no coincida porque su interfaz de metadatos no coincide con los metadatos en la exportación. Para que coincida con la exportación de muestras que has demostrado, su interfaz de metadatos debe tener este aspecto:

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

Sabía que era algo estúpido, simplemente no podía verlo. En mi interfaz, el ID era una cadena ... – Furnes

0

Para añadir metadatos a una clase derivada de una clase a la que se ha aplicado InheritedExport, debe aplicar el mismo atributo InheritedExport también a la clase derivada. De lo contrario, los datos agregados a la clase derivada estarán ocultos y no estarán disponibles.

En otras palabras, si está utilizando Lazy<T,TMetadata> para acceder a metadatos aplicados, y sus importaciones no se están llenando, puede significar que no aplicó InheritedExport a todas sus clases derivadas.

Si en su lugar aplica Export en lugar de InheritedExport, terminará con otra instancia de su pieza.