Зависимость алмазных сборок от MEF - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть четыре сборки, которые ссылаются друг на друга, как показано на рисунке выше:

TpProjectModel совместно используют интерфейсы, DILib и FileProject реализуют их, а TpPtojektCLI использует одну из реализаций в зависимости от настроек вфайл конфигурации

Когда я хочу составить их в TpProjectCLI, у меня возникает следующее исключение:

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

1) Найдено более одного экспорта, соответствующего ограничению: ContractName TpProjectModel.Reflection.IReflector RequiredTypeIdentity TpProjectModel.Reflection.IReflector

Результат: Невозможно задать импорт 'ViewModels.Dashboard.DashboardViewModel.Reflector (ContractName = "TpProjectModel.Reflection.IReflector") "для части" ViewModels.Dashboard.DashboardViewModel ".Элемент: ViewModels.Dashboard.DashboardViewModel.Reflector (ContractName = "TpProjectModel.Reflection.IReflector") -> ViewModels.Dashboard.DashboardViewModel

И код, как я получаю все необходимые сборки:

NameValueCollection plugins = (NameValueCollection)ConfigurationManager.GetSection("plugins");
string[] pluginsCatalogs = plugins.AllKeys;
List<DirectoryCatalog> assemblyCatalogs = new List<DirectoryCatalog>();

foreach (string pluginsCatalog in pluginsCatalogs)
{
    if (Directory.Exists(pluginsCatalog))
        assemblyCatalogs.Add(new DirectoryCatalog(pluginsCatalog));
}

AggregateCatalog catalog = new AggregateCatalog(assemblyCatalogs);
CompositionContainer container = new CompositionContainer(catalog);

try
{
    container.ComposeParts(this);
}
catch (CompositionException compositionException)
{
    Console.WriteLine(compositionException.ToString());
    throw;
}
catch (Exception exception) when (exception is ReflectionTypeLoadException)
{
    ReflectionTypeLoadException typeLoadException = (ReflectionTypeLoadException)exception;
    Exception[] loaderExceptions = typeLoadException.LoaderExceptions;
    loaderExceptions.ToList().ForEach(ex => Console.WriteLine(ex.StackTrace));

    throw;
}
...