MVVM и IOC: обработка инвариантов классов модели представления

Это проблема, с которой я боролся с тех пор, как начал использовать MVVM, сначала в WPF, а теперь в Silverlight.

Я использую контейнер IOC для управления разрешением представлений и ViewModels . Представления, как правило, очень простые, с конструктором по умолчанию, но модели представления имеют тенденцию обращаться к реальным службам, все из которых необходимы для их создания. Опять же, я использую контейнер IOC для разрешения, поэтому внедрение сервисов не является проблемой.

Что действительно становится проблемой, так это передача требуемых данных в ViewModel с использованием IOC. В качестве простого примера рассмотрим экран, который позволяет редактировать информацию о клиенте. В дополнение к любым службам, которые могут потребоваться, ViewModel для этого экрана требует объект клиента для отображения / редактирования данных клиента.

При разработке любого типа библиотеки (не MVVM) я считаю несгибаемым правилом, что класс инварианты передаются через конструктор. В случаях, когда мне нужны контекстно-зависимые данные для времени построения класса и , рассматриваемый класс управляется контейнером, я обычно использую абстрактную фабрику * в качестве моста. В MVVM это кажется излишним, поскольку для большинства моделей ViewModel потребуется собственная фабрика.

Несколько других подходов, которые я пробовал / считал, включают (1) метод инициализации / загрузки, в котором я передаю данные, что нарушает правило форсирование инвариантов класса через конструктор, (2) передача данных через контейнер в качестве переопределения параметров (Unity) и (3) передача данных через глобальный пакет состояний (тьфу).

Каковы некоторые альтернативные способы передачи зависящих от контекста данные от одной ViewModel к другой? Решает ли какая-либо из фреймворков MVVM эту конкретную проблему?

* , которая может иметь свои собственные проблемы, например, требовать выбора между вызовом Container.Resolve () или отсутствием управления контейнером ViewModel. У Castle Windsor есть хорошее решение для этого, но, AFAIK, никакой другой фреймворк не делает.

Edit:

Я забыл добавить: некоторые из перечисленных мною опций невозможны даже при использовании MVVM "View First", если только вы передаете данные сначала в View, а затем в ViewModel.

30
задан Phil Sandler 9 July 2011 в 15:40
поделиться