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 ...
¿Cómo es la interfaz de metadatos? –
No sabía que podía hacer un ImportMany incluyendo los metadatos. ¡bonito! – juFo