Как выбрать между MEF и любым контейнером IoC?

В каком сценарии мы должны использовать? Как определиться с выбором? И при каких обстоятельствах мы бы решили использовать и то, и другое вместе?

Я ранее работал с Unity Container (unity-container).


person Jeevan Bhatt    schedule 03.12.2010    source источник
comment
Возможный дубликат MEF по сравнению с любым IoC   -  person Palec    schedule 19.05.2019


Ответы (4)


Сложный вопрос - поскольку они действительно частично совпадают.

Я бы сказал так:

  • используйте любой полезный IoC, если вас в первую очередь беспокоит внедрение зависимостей ради разделения компонентов, например за возможность вместо этого ввести макет (для тестирования)

  • используйте MEF, особенно если вам больше нравится расширяемость, например иметь возможность «загружать все сборки из этого каталога, которые экспортируют определенный интерфейс», и если вам нужно быть расширяемым и открытым для третьих лиц (например, Visual Studio: предложить общедоступный API, чтобы другие могли написать расширение для вашего приложения). Вот где действительно сияет MEF

Для MEF и Unity также существует уровень интеграции MEF и Unity объединить сильные стороны обоих инструментов вместе.

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

person marc_s    schedule 03.12.2010
comment
Я нахожу сообщение в блоге Айенде сбивающим с толку. Например, MEF не может запрашивать метаданные без загрузки сборок и не имеет адаптеров контракта вопреки тому, что говорится в сообщении. В этом посте много размахивания руками. - person Wim Coenen; 03.12.2010

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

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

person Ian Ringrose    schedule 03.12.2010

Глен Блок (бывший менеджер по продукту MEF) довольно хорошо осветил это в своем блоге:

person Wim Coenen    schedule 03.12.2010

Я слышал прекрасное объяснение этого (извиняюсь перед автором, я забыл, кто это был): на очень высоком уровне IoC хорош, когда вам нужно что-то одно для данного интерфейса, MEF хорош, когда вам нужно все из заданного интерфейса.

Например, в IoC вы хотите вернуть конкретный единственный конкретный класс для интерфейса:

For<ICarFactory>().Use<CarFactory>();

Когда бы вы ни захотели использовать ICanFactory, вы получите CarFactory.

MEF хорош тем, что говорит: дай мне все автозаводы:

CheapCarFactory : ICarFactory
FamilyCarFactory : ICarFactory 
LuxuryCarFactory : ICarFactory

И Т. Д.

person Michael Shimmins    schedule 03.12.2010
comment
Это делают почти все современные контейнеры IOC. - person Nicholas Blumhardt; 03.12.2010