11 Stimmen

MEF mit ImportMany und ExportMetadaten

Ich habe gerade angefangen, mit dem Managed Extensibility Framework herumzuspielen. Ich habe eine Klasse, die exportiert wird und eine Import-Anweisung:

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

Das funktioniert sehr gut. Die IEnumerable erhalten die exportierten Klassen. Nein, ich versuche, dies zu ändern, um die Lazy-Liste zu verwenden und die Metadaten enthalten, so dass ich die Klasse herausfiltern kann, die ich brauche (gleiche Export wie zuvor)

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

Danach hat die Ienumerable keine Elemente mehr. Ich vermute, dass ich irgendwo einen offensichtlichen und dummen Fehler gemacht habe

9voto

Daniel Plaisted Punkte 16486

Wahrscheinlich stimmt es nicht überein, weil Ihre Metadatenschnittstelle nicht mit den Metadaten im Export übereinstimmt. Um dem von Ihnen gezeigten Beispielexport zu entsprechen, sollte Ihre Metadatenschnittstelle wie folgt aussehen:

public interface IMapMetaData
{
    int ID { get; }
}

0voto

Suncat2000 Punkte 781

Um Metadaten zu einer Klasse hinzuzufügen, die von einer Klasse abgeleitet ist, zu der InheritedExport angewandt wurde, müssen Sie die gleiche InheritedExport Attribut auch für die abgeleitete Klasse. Andernfalls werden die der abgeleiteten Klasse hinzugefügten Metadaten ausgeblendet und sind nicht verfügbar.

Mit anderen Worten: Wenn Sie die Lazy<T,TMetadata> um auf die angewandten Metadaten zuzugreifen, und Ihre Importe werden nicht aufgefüllt, bedeutet dies möglicherweise, dass Sie die Metadaten nicht angewandt haben. InheritedExport für alle abgeleiteten Klassen.

Wenn Sie stattdessen Folgendes anwenden Export anstelle von InheritedExport werden Sie eine weitere Instanz Ihrer Rolle erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X