С этой проблемой я боролся с тех пор, как начал использовать MVVM, сначала в WPF, а теперь в Silverlight.
Я использую контейнер IOC для управления разрешением Views и ViewModels. Представления, как правило, очень простые, с конструктором по умолчанию, но ViewModels стремятся получить доступ к реальным сервисам, которые необходимы для их построения. Опять же, я использую контейнер IOC для разрешения, поэтому внедрение служб не является проблемой.
Проблема, связанная с передачей необходимых данных в ViewModel с использованием IOC. В качестве простого примера рассмотрим экран, который позволяет редактировать клиента. В дополнение к любым службам, которые могут потребоваться, ViewModel для этого экрана требует объект клиента для отображения / редактирования данных клиента.
При разработке библиотек любого типа (не MVVM) я считаю несгибаемым правило, что инварианты классов передаются через конструктор. В случаях, когда мне нужны контекстно-зависимые данные для времени создания класса и , рассматриваемый класс управляется контейнером, я склонен использовать абстрактную фабрику * в качестве моста. В MVVM это кажется излишним, поскольку большинству ViewModels потребуется собственный завод.
Несколько других подходов, которые я пробовал / рассматривал, включали (1) метод инициализации / загрузки, в котором я передаю данные, что нарушает правило форсирования инвариантов классов через конструктор, (2) передача данных через контейнер в качестве параметра переопределения (Unity) и (3) передача данных через глобальный пакет состояний (тьфу).
Каковы некоторые альтернативные способы передачи контекстно-зависимых данных из одной ViewModel в другую? Решает ли какая-либо из сред MVVM эту конкретную проблему?
*, которая может иметь свои собственные проблемы, например, необходимость выбора между вызовом Container.Resolve () или отсутствие управления вашим контейнером ViewModel. У Castle Windsor есть хорошее решение этой проблемы, но AFAIK нет у других фреймворков.
Edit:
Я забыл добавить: некоторые из перечисленных опций даже невозможны, если вы выполняете MVVM "Сначала просмотр", если только вы сначала не передаете данные в View, а затем в ViewModel.