Невозможно загрузить несколько частей MEF

У меня есть настольное приложение Winforms, которое загружает несколько частей MEF с одним и тем же типом интерфейса.

Проблема: когда я пытаюсь загрузить более одного экземпляра одного и того же типа, я получаю следующее исключение:

Состав остается неизменным. Изменения были отклонены из-за следующих ошибок: при композиции возникла единственная ошибка композиции. Основная причина указана ниже. Просмотрите свойство CompositionException.Errors для получения более подробной информации.

1) Не обнаружено ни одного действительного экспорта, соответствующего ограничению '((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") && (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") && "BOCA.TaskPilot.Common. Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))) ', недопустимый экспорт мог быть отклонен.

Результат: Невозможно установить импорт «TaskPilot.Windows.MainForm.FolderViewExtension (ContractName =" BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ")» в части «TaskPilot.Windows.MainForm». Элемент: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm

Вот код для загрузки деталей:

            AggregateCatalog catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        //string myExecName = Assembly.GetExecutingAssembly().Location;
        //string myPath = Path.GetDirectoryName(myExecName);
        catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.TaskPilot.FolderView\bin\Debug"));
        catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.TaskPilot.TaskView\bin\Debug"));
        // Uncomment below line and it works without exceptions raised
        //catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.FileManager\bin\Debug"));

        var container = new CompositionContainer(catalog);
        container.ComposeParts(this);

Вот код класса для каждой части MEF:

[Export(typeof(IFolderItemsViewExtension))
public partial class TaskTreeView : DevExpress.XtraEditors.XtraUserControl, IFolderItemsViewExtension, IPartImportsSatisfiedNotification]

Вот импорт, используемый в основной форме:

[ImportMany(AllowRecomposition = true)]
    private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null;

Если я раскомментирую последнюю строку Catalog.Catalogs.Add, она выдаст исключение. Если я запустил его без этого, он будет работать нормально. Эта строка загружает другой пользовательский элемент управления, реализующий интерфейс IFolderItemsViewExtension. Я попытался просто загрузить фиктивный проект, в котором все, что у него есть, - это пользовательский элемент управления и этот интерфейс, и я все еще получаю то же исключение. Независимо от того, что я делаю, я все равно получаю это исключение.

Кажется, что все работает нормально, пока я не загружаю более одного экземпляра MEF одного типа.

Используется последняя версия 2009.22.10.0 System.ComponentModel.Composistion из загрузки MEF.


person user120985    schedule 28.12.2009    source источник


Ответы (2)


Ошибка указывает на то, что не удается найти экспорт типа IFolderViewExtension. Обратите внимание, что это отличается от импорта IFolderItemsViewExtension, который вы показали.

Я предполагаю, что проблема не в том, что у вас есть несколько IFolderItemsViewExtensions, а в том, что у вас есть несколько IFolderViewExtensions, или есть какой-то другой контракт, который у вас более одного, который вы используете с импортом, для которого требуется ровно один.

Это может быть вызвано тем, что одна и та же сборка находится в нескольких каталогах каталогов. Это легко может произойти, если у вас есть ссылка на сборку, а для параметра copy local установлено значение true.

person Daniel Plaisted    schedule 28.12.2009

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

person Pitambar    schedule 25.01.2013