Squeak.ru - шаблоны программирования

ImportMany из MEF загружает контракты дважды

У меня есть два класса, которые экспортируют IScreen, но когда я импортирую их с помощью

[ImportMany(typeof(IScreen))]
private IEnumerable<Lazy<IScreen,IJIMSMetadata>> _modules;
public IEnumerable<Lazy<IScreen, IJIMSMetadata>> Modules
{
        get { return _modules; }
}

Модули содержат четыре экземпляра IScreen, но я экспортировал только два.

Это контейнер

container = new CompositionContainer(
                new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)))                
                );


protected override IEnumerable<Assembly> SelectAssemblies()
{
    string _modulePath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "Modules");
    var files = Directory.GetFiles(_modulePath, "*.dll", SearchOption.AllDirectories);

    List<Assembly> assemblies = new List<Assembly>();
    assemblies.Add(Assembly.GetExecutingAssembly());
    foreach (var file in files)
    {
        assemblies.Add(Assembly.LoadFrom(file));
    }
    return assemblies;
}

  • Расскажите нам, как вы строите свой CompositionContainer 04.11.2012
  • Контейнер загружает только один класс, используя assemby.load из 04.11.2012
  • Дикое предположение, но находится ли ваша сборка где-то, где рекурсия по ее местоположению загрузит одну и ту же сборку дважды. Например. Он рекурсивно проходит через папки Debug и Release? 04.11.2012
  • Нет, saassembly загружается только один раз 04.11.2012
  • Можете ли вы показать нам, как/куда вы экспортируете IScreen? 19.11.2012
  • У меня точно такая же проблема. Вы решили это? 27.08.2013
  • Я также столкнулся с подобной проблемой. Dll загружалась только один раз, а класс дважды. Проблема заключалась в том, что у меня был класс в двух файлах, разделенных частичной директивой. Каждому определению предшествовал атрибут [Export (typeof (IMyInterface)]), и это было проблемой. MEF загружает класс столько раз, сколько определен атрибут Export. 22.05.2019

Ответы:


1

Поскольку вы используете AggregateCatalog, убедитесь, что вы не добавляете и AssemblyCatalog, и DirectoryCatalog для расположения, содержащего исполняемую сборку.

Например, следующий код позволяет избежать двойной обработки одной и той же сборки.

var catalog = new AggregateCatalog();
var locations = new List<string>();
foreach (var loc in GetPluginDirectories())
    if (!locations.Contains(loc))
    {
        catalog.Catalogs.Add(new DirectoryCatalog(loc));
        locations.Add(loc);
    }

var asm = Assembly.GetExecutingAssembly();
if (!locations.Contains(Path.GetDirectoryName(asm.Location)))
    catalog.Catalogs.Add(new AssemblyCatalog(asm));
14.10.2013
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...