Вы можете использовать так называемый Lazy Export , чтобы интерфейс не разрешался до тех пор, пока вы его явно не используете.
Если вам нужно создать несколько экземпляров, MEF не особенно хорошо это поддерживает. Вы можете сделать свое собственное обнаружение и создание экземпляра или определить экспорт следующим образом:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(ISomething)]
public class Something : ISomething { }
Недостатком является то, что теперь везде, где вам нужно создать экземпляр, вам нужно иметь ссылку на фактический экземпляр контейнера. Тогда вы можете сделать:
var something = _container.GetExportedObject<ISomething>();
РЕДАКТИРОВАТЬ: Хорошо, я думаю, я лучше понимаю, что вы после. Вот как я обычно решал эту проблему:
Я реализую свои объекты View как экземпляры UserControl и не устанавливаю DataContext нигде в их коде или XAML.
Я создаю шаблон данных, который связывается с типом модели представления с элементом управления пользователя.
На моем MainViewModel (или на том, что соответствует представлению, в котором размещены регионы), я предоставляю общий объект RegionX (возможно, напечатанный на интерфейсе, если все мои ViewModels будут использовать некоторые общие функции, но Object работает нормально).
Я создаю ContentPresenter с Content, привязанным к свойству RegionX.
Теперь мой MainViewModel может импортировать разные экземпляры ViewModel, соответствующие типам ViewModel, которые могут быть размещены в RegionX. Когда я хочу переключить «активный» вид в регионе, я просто устанавливаю RegionX на соответствующую ViewModel.