MEF с ImportMany и ExportMetadata - PullRequest
       13

MEF с ImportMany и ExportMetadata

11 голосов
/ 05 февраля 2011

Я только начал играть с фреймворком Managed Extensibility. У меня есть класс, который экспортируется, и оператор импорта:

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

Это работает просто отлично. IEnumerable получает экспортируемые классы. Нет, я пытаюсь изменить это, чтобы использовать список Ленивых и включить метаданные, чтобы я мог отфильтровать нужный мне класс (тот же экспорт, что и раньше)

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

После этого Ienumerable не имеет элементов. Я подозреваю, что где-то допустил очевидную и глупую ошибку ...

Ответы [ 2 ]

8 голосов
/ 06 февраля 2011

Возможно, это не соответствует, потому что ваш интерфейс метаданных не соответствует метаданным при экспорте.Чтобы соответствовать примеру экспорта, который вы показали, ваш интерфейс метаданных должен выглядеть следующим образом:

public interface IMapMetaData
{
    int ID { get; }
}
0 голосов
/ 02 декабря 2014

Чтобы добавить метаданные в класс, производный от класса, к которому был применен InheritedExport, необходимо применить тот же атрибут InheritedExport также к производному классу.В противном случае метаданные, добавленные в производный класс, будут скрыты и недоступны.

Другими словами, если вы используете Lazy<T,TMetadata> для доступа к примененным метаданным, а ваш импорт не заполняется, это может означать, что вы этого не сделалиприменить InheritedExport ко всем вашим производным классам.

Если вместо этого вы примените Export вместо InheritedExport, у вас получится другой экземпляр вашей части.

...