У меня проблема с проверкой концепции приложения для плагинов 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».
очевидно, что обнаружены две копии, поэтому вместо этого простозагрузка первого дважды?Экземпляр по умолчанию определен в базовых файлах с интерфейсами, и этот, кажется, прекрасно сосуществует.