Я слышал отличное объяснение этого (извинения автору, я забыл, кто это был): на очень высоком уровне IoC хорош, когда вы хотите что-то для данного интерфейса, MEF хорош, когда вы хочу все вещи из данного интерфейса.
Например, в IoC вы хотите вернуть конкретный отдельный конкретный класс для интерфейса:
For<ICarFactory>().Use<CarFactory>();
Всякий раз, когда вы захотите использовать ICanFactory
, вы получите CarFactory
.
MEF хорош, чтобы сказать, дайте мне все автомобильные заводы:
CheapCarFactory : ICarFactory
FamilyCarFactory : ICarFactory
LuxuryCarFactory : ICarFactory
Etc.