Проблема со сложным импортом производного типа в приложение MEF Host - PullRequest
0 голосов
/ 11 декабря 2010

Получение следующего по вызову hostContainer.ComposeParts():

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

1) Не найдено допустимых экспортов, соответствующих ограничению '((exportDefinition.ContractName == "ModLibrary.IDataHandler") AndAlso (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") И также "ModLibrary.IDataHandler" .Equals (exportDefinition.Metadata.get_Item ("ExportTypeIdentity")))) ', недопустимые экспортные данные могут быть отклонены.

В результате: Невозможно установить импорт' ModAppWorks.Host.DataHandler (ContractName = "ModLibrary.IDataHandler") 'в части' ModAppWorks.Host '.Элемент: ModAppWorks.Host.DataHandler (ContractName = "ModLibrary.IDataHandler") -> ModAppWorks.Host

Source = System.ComponentModel.Composition StackTrace: в System.ComponentModel.Composition.CompositionResomomCom элементов Atom.attribuParts) в ModAppWorks.Host.Compose () в C: \ Projects \ ModAppWorks_2 \ HostProgram.cs: строка 83 в ModAppWorks.Host.Run () в C: \ Projects \ ModAppWorks_2 \ HostProgram.cs: строка 49 в ModAppWorks.Program.Main () в C: \ Projects \ ModAppWorks_2 \ HostProgram.cs: строка 25 в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, аргументы String []) в System.AppDomain.ExecuteAssembly (сборка строк FileFile, сборка Evidence.lySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run (вызов метода ExecutionContext, обратный вызов состояния объекта, объектный возврат контекста, контекстный вызовignoreSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback callback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:

Фрагмент импорта:

[Import(typeof(IDataHandler))]
public Lazy<IDataHandler> DataHandler { get; set; }

Однако DataHandler определяется следующим образом:

[Export(typeof(IDataHandler))]
public class DataAgent : DataProvider<SqlConnection, SqlDataReader>, IDataHandler
{
    // contains an empty public ctor passing ctor parameters to DataProvider
}

DataProvider - это абстрактный класс, который также наследует IDataHandler и фактически реализует интерфейс IDataHandler.Кроме того, сборки записываются непосредственно в каталог \ Extensions для приложения Host.

Есть предложения, что я делаю не так?

1 Ответ

0 голосов
/ 12 декабря 2010

Я начал подозревать, что конструктор не может вызвать базовый конструктор с параметрами. Я удалил вызов на : base(param1, param2) и класс будет импортирован.

Редактировать

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

...