Оборачиваясь вокруг MEF: как загрузить View (Model)? - PullRequest
2 голосов
/ 22 ноября 2010

Я изучаю призму V4, используя MEF для загрузки своих модулей.Загрузка модулей работает, но в одном модуле я хочу загрузить View / ViewModel (MVVM) и не знаю, как получить MEF, чтобы решить все эти проблемы за меня.

Во-первых: как мне нужнопометить ViewModel (я следую примеру StockTraderRI), чтобы он не загружался при запуске, а вместо этого мог быть загружен во время выполнения в область?

Второй: как мне загрузить ViewModel, используя MEF, чтобы он был подключен ксоответствующие интерфейсы?

MEF делает это очень хорошо для вещей при запуске, которые помечены как [Экспорт], но я понятия не имел, как этого добиться во время выполнения.

1 Ответ

2 голосов
/ 22 ноября 2010

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


Если вам нужно создать несколько экземпляров, MEF не особенно хорошо это поддерживает. Вы можете сделать свое собственное обнаружение и создание экземпляра или определить экспорт следующим образом:

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(ISomething)]
public class Something : ISomething { }

Недостатком является то, что теперь везде, где вам нужно создать экземпляр, вам нужно иметь ссылку на фактический экземпляр контейнера. Тогда вы можете сделать:

var something = _container.GetExportedObject<ISomething>();

РЕДАКТИРОВАТЬ: Хорошо, я думаю, я лучше понимаю, что вы после. Вот как я обычно решал эту проблему:

  1. Я реализую свои объекты View как экземпляры UserControl и не устанавливаю DataContext нигде в их коде или XAML.

  2. Я создаю шаблон данных, который связывается с типом модели представления с элементом управления пользователя.

  3. На моем MainViewModel (или на том, что соответствует представлению, в котором размещены регионы), я предоставляю общий объект RegionX (возможно, напечатанный на интерфейсе, если все мои ViewModels будут использовать некоторые общие функции, но Object работает нормально).

  4. Я создаю ContentPresenter с Content, привязанным к свойству RegionX.

  5. Теперь мой MainViewModel может импортировать разные экземпляры ViewModel, соответствующие типам ViewModel, которые могут быть размещены в RegionX. Когда я хочу переключить «активный» вид в регионе, я просто устанавливаю RegionX на соответствующую ViewModel.

...