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