МВВМ и избегающий монолитного бога объект - PullRequest
8 голосов
/ 01 июня 2010

Я нахожусь на стадии завершения большого проекта, в котором есть несколько крупных компонентов: получение изображений, обработка изображений, хранение данных, фабричный ввод-вывод (проект автоматизации) и ряд других.

Каждый из этих компонентов достаточно независим, но для запуска проекта в целом мне нужен как минимум один экземпляр каждого компонента. Каждый компонент также имеет ViewModel и View (WPF) для мониторинга состояния и изменения вещей.

Мой вопрос - это самый безопасный, самый эффективный и наиболее обслуживаемый способ создания экземпляров всех этих объектов, подписки одного класса на событие в другом и наличия общих ViewModel и View для всего этого.

Было бы лучше, если бы у меня был класс по имени Бог, у которого есть частный экземпляр всех этих объектов? Я делал это в прошлом и сожалел об этом.

Или было бы лучше, если бы Бог полагался на экземпляры этих объектов в Синглтоне, чтобы заставить мяч двигаться.

В качестве альтернативы, должен ли Program.cs (или там, где Main (...)) создавать все эти компоненты и передавать их Богу в качестве параметров, а затем позволять Ему (хихикать) и Его ViewModel иметь дело с особенностями запуска этого проекты.

Любые другие предложения, которые я хотел бы услышать.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 01 июня 2010

Взгляните на некоторые инфраструктуры внедрения зависимостей, такие как Unity (которую использует CAL), Castle Windsor или Spring.NET.

3 голосов
/ 01 июня 2010

Эти проблемы довольно хорошо решаются при использовании Microsoft Composite Application Library (также называемой Prism), среды разработки для составных WPF-приложений:

http://msdn.microsoft.com/en-us/library/ff647752.aspx

http://msdn.microsoft.com/en-us/library/ff648611.aspx

  • Составление ваших представлений : Prism имеет концепцию окна оболочки приложения и менеджера регионов. Оболочка действует как макетная страница, где вы определяете именованные области-заполнители, например "MainMenu" и "TabInterface". Вы оборачиваете ссылки до ваших представлений и моделей представления в классах модуля, например. «MainMenuModule» и «TabInterfaceModule» и определяют, с каким регионом должен быть связан модуль. Prism создаст ваши представления и вставит их в области оболочки при запуске приложения. Это позволяет вам составлять свои взгляды независимо друг от друга.

  • Связь между моделями представления : Prism поддерживает шаблон посредника, называемый «агрегатором событий». В основном вы можете публиковать и подписываться на сообщения через агрегатор событий из ваших моделей просмотра. Это позволяет моделям представления свободно общаться через сообщения, а не узнавать друг о друге и перехватывать события.

Призма защищает и поддерживает шаблоны для разработки компонентов независимо друг от друга в слабосвязанной манере, без введения объектов Бога и чрезмерной связи. Большая часть Prism - это использование IOC и внедрение зависимостей, поэтому модульное тестирование также становится намного проще.

Я нашел следующую статью хорошим практическим введением в использование Prism и MVVM:

http://www.developmentalmadness.com/archive/2009/10/03/mvvm-with-prism-101-ndash-part-1-the-bootstrapper.aspx

2 голосов
/ 01 июня 2010

Мой предпочтительный способ получения ViewModels - использование ViewModelLocater. По сути, это объект God, который вы подразумеваете, но единственной обязанностью является создание каждой модели ViewModel и сохранение ссылки на нее. Я обычно добавляю VML к ресурсам приложения, и каждое представление отвечает за установку его DataContext для правильного ViewModel. Если вы подписываетесь на несколько событий, вы можете либо подключить их VML вручную, либо создать виртуальную машину, которая сначала выдает события и передает ее зависимой виртуальной машине в своем конструкторе.

1 голос
/ 04 июня 2010

Вы можете использовать Контроллеры (ApplicationController, Use-Case Controllers) вместо класса "Бог". Контроллеры несут ответственность за создание объектов ViewModel и являются посредниками между ними.

Как это работает, показывает WPF Application Framework (WAF) .

0 голосов
/ 01 июня 2010

Надеюсь, я хорошо понял ваш вопрос. Я думаю, что использование God ViewModel не очень хорошая идея. Лучше иметь одну модель представления для каждого из ваших представлений и создавать экземпляры всех связанных моделей представления в этой модели представления. затем вы можете использовать посредник для отправки сообщения между моделями представления этого представления и другими представлениями, safly. также я призываю использовать команды wpf вместо событий. Вы можете найти большую статью о посреднике в здесь .

...