В каком сценарии мы должны использовать? Как определиться с выбором? И при каких обстоятельствах мы бы решили использовать и то, и другое вместе?
Я ранее работал с Unity Container (unity-container).
В каком сценарии мы должны использовать? Как определиться с выбором? И при каких обстоятельствах мы бы решили использовать и то, и другое вместе?
Я ранее работал с Unity Container (unity-container).
Сложный вопрос - поскольку они действительно частично совпадают.
Я бы сказал так:
используйте любой полезный IoC, если вас в первую очередь беспокоит внедрение зависимостей ради разделения компонентов, например за возможность вместо этого ввести макет (для тестирования)
используйте MEF, особенно если вам больше нравится расширяемость, например иметь возможность «загружать все сборки из этого каталога, которые экспортируют определенный интерфейс», и если вам нужно быть расширяемым и открытым для третьих лиц (например, Visual Studio: предложить общедоступный API, чтобы другие могли написать расширение для вашего приложения). Вот где действительно сияет MEF
Для MEF и Unity также существует уровень интеграции MEF и Unity объединить сильные стороны обоих инструментов вместе.
Я также рекомендую вам ознакомиться с отличным сообщением в блоге Айенде о том, что отличает MEF от IoC.
MEF эффективен, когда у вас есть сторонние плагины, которые реализуют интерфейсы, и вы хотите иметь возможность изменять версию своего интерфейса, не нарушая работу стороннего плагина, который нельзя перекомпилировать. В свою очередь, MEF более сложен, чем необработанный IoC.
Поэтому я бы сказал, что IoC, если все скомпилировано как часть одной и той же системы сборки, и MEF, если вам нужно справиться с надстройками, вы не можете перекомпилировать самостоятельно.
Глен Блок (бывший менеджер по продукту MEF) довольно хорошо осветил это в своем блоге:
Я слышал прекрасное объяснение этого (извиняюсь перед автором, я забыл, кто это был): на очень высоком уровне IoC хорош, когда вам нужно что-то одно для данного интерфейса, MEF хорош, когда вам нужно все из заданного интерфейса.
Например, в IoC вы хотите вернуть конкретный единственный конкретный класс для интерфейса:
For<ICarFactory>().Use<CarFactory>();
Когда бы вы ни захотели использовать ICanFactory, вы получите CarFactory.
MEF хорош тем, что говорит: дай мне все автозаводы:
CheapCarFactory : ICarFactory
FamilyCarFactory : ICarFactory
LuxuryCarFactory : ICarFactory
И Т. Д.