MEF ImportMany первая реализация интерфейса маскирует любые последующие реализации - PullRequest
1 голос
/ 24 июня 2019

У меня проблема с проверкой концепции приложения для плагинов MEF.У меня есть простой класс, который на данный момент возвращает цвет и теги exportmetadata этого цвета.Однако, если я помещу три dll в каталог, каждый с уникальным экспортом, ImportMany получит три копии первой загружаемой вещи, и ни одна из других не будет присутствовать.

public interface IColorMatch
{
    string ValidationMessage { get; }
}

public interface IColorMatchData
{
    string Color { get; }
}

и реализациикаждый в отдельной dll

[Export(typeof(IColorMatch))]
[ExportMetadata("Color","RED")]
class RedColor : IColorMatch
{
    public string ValidationMessage
    {
        get
        {
            return "RED";
        }
    }
}

[Export(typeof(IColorMatch))]
[ExportMetadata("Color","BLUE")]
class BlueColor : IColorMatch
{
    public string ValidationMessage
    {
        get
        {
            return "BLUE";
        }
    }
}

и, наконец, код для загрузки всего этого

[ImportMany]
IEnumerable<Lazy<IColorMatch, IColorMatchData>> Colors;

public void OnClick(object sender, RoutedEventArgs e)
{
    var catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new DirectoryCatalog(AppContext.BaseDirectory));

    //Create the CompositionContainer with the parts in the catalog
    _container = new CompositionContainer(catalog,CompositionOptions.DisableSilentRejection);

    //Fill the imports of this object
    try
    {
        this._container.ComposeParts(this);
    }
    catch (CompositionException compositionException)
    {
        Console.WriteLine(compositionException.ToString());
    }

    //this is just for convenience while at a breakpoint  
    var debug = Colors.Select(x => x.Metadata.Color.ToLower());
    var list = Colors.Where(x => x.Metadata.Color.ToLower() == txtColor.Text.ToLower());
    if (list.Count() < 1)
    {
        list = Colors.Where(x => x.Metadata.Color == "Default");
    }
    foreach (Lazy<IColorMatch, IColorMatchData> item in list)
    {
        lstbox.Items.Add($"This was processed using code for the {item.Value.ValidationMessage}");
    }
}

, и окончательный результат, если я запускаю пользовательский интерфейс только с red.dll в каталогев списке отладки будут только записи «КРАСНЫЙ» и «По умолчанию».Если у меня есть только blue.dll в каталоге, отладка содержит «Blue» и «Default».Если в каталоге одновременно есть и red.dll, и blue.dll, отладка содержит «RED», «RED» и «Default».

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

...