Чего не хватает в MEF, чтобы быть на одном уровне с контейнерами IoC? - PullRequest
6 голосов
/ 17 июня 2011

MEF составляет , а не IoC контейнер . Но, похоже, это почти контейнер IoC. Кажется, я могу легко заставить MEF вести себя как контейнер IoC (см. Пример ниже), и не так уж и много, чтобы сделать MEF полноценным контейнером IoC.

Каковы фактические функции, которые отсутствуют в MEF, которые StrucureMap, Unity и т. Д. Должны получить на одном уровне?

Как вы думаете, этот запрос имеет смысл?

using System;  
using System.Collections.Generic;  
using System.ComponentModel.Composition;  
using System.ComponentModel.Composition.Hosting;  
using System.ComponentModel.Composition.Primitives;  
using System.Linq;  
...
private CompositionContainer container;
public void Configure()  
{  
    container = CompositionHost.Initialize(  
        new AggregateCatalog(
            AssemblySource.Instance.Select(
              x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));       
        var batch = new CompositionBatch();        
        batch.AddExportedValue<IWindowManager>(new WindowManager());  
        batch.AddExportedValue<IEventAggregator>(new EventAggregator());  
        batch.AddExportedValue(container);        
        container.Compose(batch);  
 }  

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

Чего не хватает в MEF, чтобы быть на одном уровне с контейнерами IoC?

Способ простой диагностики проблем в композиции.

Например, если у вас есть цепочка зависимостей A -> B -> C -> D, а D отсутствует, то по принципу стабильная композиция MEF просто помечает A, B и С недоступен и постараюсь сделать композицию без этих частей. Ваше сообщение об ошибке будет жаловаться на A, а не D.

Чтобы диагностировать проблему, вам нужно как-то вывести диагностическую диагностику композиции (например, с помощью mefx ) и тщательно следовать по пути зависимости вниз, пока вы не найдете реальную проблему. Это больно, но вроде работает, пока вы не введете циклические зависимости ...

Обычный контейнер IoC не имеет этой проблемы. Он просто скажет вам «эй, вы зарегистрировали C для использования в композиции, но я не могу найти его зависимость D».

См. Также мое сообщение в блоге на эту тему.

3 голосов
/ 17 июня 2011

Как уже говорилось, MEF не был создан, чтобы быть контейнером IoC. Однако, у этого есть много общих черт. Если функциональности, предоставляемой MEF, достаточно для нужд вашего контейнера IoC, вы можете использовать его как контейнер IoC.

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

  • Опционально отключение отклонения для упрощения диагностики ошибок в системе, где вы не хотите, чтобы что-либо было отклонено
  • Поддержка модели конвенции, которая позволяет регистрировать типы для экспорта и импорта вместо добавления атрибутов экспорта и импорта к самим типам.
  • Открытая универсальная поддержка, так что вы можете экспортировать открытый универсальный и импортировать закрытую версию.
  • Лучшая поддержка для контейнеров с объемной областью / иерархической структурой, что может помочь в управлении временем жизни.

Томас упоминает перехват как важную особенность. В настоящее время у нас нет планов включать поддержку для этого из коробки. MefContrib имеет некоторую поддержку для этого в форме InterceptingCatalog, я считаю.

3 голосов
/ 17 июня 2011

Мне не известны последние возможности MEF, но что я могу сказать, так это то, что MEF - это структура, которая решает проблемы расширения для приложений.Основное внимание уделяется включению сценариев надстроек для стандартного программного обеспечения.Он имеет так много черт с «правильными» контейнерами IoC, что в будущем он может стать полноценным контейнером IoC.

Mef был создан для другой цели, чем контейнер IoC.Его цель - предоставить общую платформу для включения функциональности надстроек для стандартных приложений.С точки зрения стандартного приложения надстройка - это, по сути, неизвестный компонент .

Когда мы используем контейнер IoC в качестве инструмента для создания приложения, мы знаем о компонентах, которыесоставьте заявку.

Контейнеры IoC нацелены на разделение состава сервисов, что хорошо, но разработчик должен знать о компонентах, которые он хочет составить, в то время, когда сконфигурированный конейнер настроен, когда MEF стремится к обнаружению компонентов.Единственное, что вам следует знать, - об абстракции, которую вы хотите использовать.

MEF имеет так много общего с контейнерами IoC, что иногда трудно сказать, как мы должны это учитывать.

Я думаю, чтоосновной недостаток MEF:

  • плохое управление временем жизни по сравнению с IoC
  • отсутствие перехвата

Какие основные моменты при разговоре о контейнерах IoC.

...