Как выбрать между MEF и любым контейнером IoC? - PullRequest
4 голосов
/ 03 декабря 2010

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

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

Ответы [ 4 ]

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

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

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

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

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

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

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

1 голос
/ 03 декабря 2010

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

1 голос
/ 03 декабря 2010

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

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

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

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

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

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

Всякий раз, когда вы захотите использовать ICanFactory, вы получите CarFactory.

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

CheapCarFactory : ICarFactory
FamilyCarFactory : ICarFactory 
LuxuryCarFactory : ICarFactory

Etc.

...