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 ..
Che aspetto ha l'interfaccia dei metadati? –
Non sapevo che potessi fare un ImportMany compresi i metadati. simpatico! – juFo