Как представить состояние граф объекта объекта модели представления?
Я нахожусь в процессе улучшения моего понимания лучших практик MVVM / внедрения зависимостей, и кое-что, что кажется фундаментальным, все еще довольно неясно.
Сценарий:
- Модель (составленная по шаблону Composition Root) состоит из графа объекта DI, подобного следующему:
Составные части графа (A1, B1 и т. Д.) Имеют состояние.
Состояние составных частей (A1.StateA1, B1.StateB1 и т. Д.) Не только служит зависимостями для других объектов в графе, но также должно отображаться в представлении.
Вопросы:
- Как правильно отобразить это фрагментированное / вложенное состояние для модели представления?
Если мое понимание верно, модель не должна обслуживать какую-либо визуализацию состояния - это обязанность модели представления форматировать данные в соответствии с требованиями представления.
Означает ли это, что модель представления должна знать о специфике композиции модели и напрямую ссылаться, например, на B2.StateB2 (или даже A1.A2.B1.B2.StateB2)?
- Или это хорошая практика, чтобы попытаться разделить состояние и поведение и сохранить все состояния в плоском объекте, который легко использовать моделью представления?
Специфика того, что я пытаюсь сделать:
Конкретное приложение, которое я разрабатываю, служит простым расширением бизнес-приложения (программного обеспечения для локализации), чтобы восполнить некоторые недостающие функциональные возможности, которые особенно полезны в большом проекте по локализации. Модель моего приложения получает данные из нескольких источников:
- Один источник отслеживает процесс целевого приложения и состояние окна, подписавшись на
Process.HasExited
а такжеAddAutomationFocusChangedEventHandler
, - Другой источник читает частную память целевого процесса с помощью PInvokes через определенный интервал времени.
- Еще два других источника - это файлы XML (точнее, XLIFF), в которых мне нужно искать узлы на основе последнего значения, которое я прочитал из памяти целевого процесса. Этот поиск создает список строк, связанных с активным модулем локализации в программном обеспечении локализации - это основная информация, которую необходимо передать представлению приложения.
Я признаю, что приложение немного хакерское, но на карту поставлено около 20% разницы в производительности конечных пользователей.:)
Основная модель представления довольно проста, всего несколько элементов управления, включая WebBrowser, который я заполняю собранными и отформатированными данными HTML. Критическим моментом здесь является постоянное обновление данных, но объекты моей модели реализуют INotifyPropertyChanged для этой цели.
1 ответ
Или это хорошая практика, чтобы попытаться разделить состояние и поведение и сохранить все состояния в плоском объекте, который легко использовать моделью представления?
Если вы ссылаетесь на состояние, отображаемое приложением с помощью представлений, то да, оно должно быть сведено или, что еще лучше, сохранено в самой ViewModel.
Где модель получает данные? Могли бы вы сохранить эти данные непосредственно в ViewModel, а не создавать модель только для хранения данных между источником и ViewModel?
Обычно при разработке MVVM подход Composition Root к IoC выполняется с помощью моделей представления, а не моделей.