МВВМ и избегающий монолитного бога объект
Я нахожусь в стадии завершения большого проекта, который имеет несколько крупных компонентов: получение изображений, обработка изображений, хранение данных, фабричный ввод / вывод (проект автоматизации) и несколько других.
Каждый из этих компонентов является достаточно независимым, но для запуска проекта в целом мне нужен как минимум один экземпляр каждого компонента. Каждый компонент также имеет ViewModel и View (WPF) для мониторинга состояния и изменения вещей.
Мой вопрос - это самый безопасный, самый эффективный и самый обслуживаемый метод создания всех этих объектов, подписки одного класса на событие в другом и наличия общих ViewModel и View для всего этого.
Было бы лучше, если бы у меня был класс под названием Бог, у которого есть частный экземпляр всех этих объектов? Я делал это в прошлом и сожалел об этом.
Или было бы лучше, если бы Бог полагался на экземпляры этих объектов в Синглтоне, чтобы заставить мяч двигаться.
В качестве альтернативы, должен ли Program.cs (или где бы Main (...) ни находился) создавать все эти компоненты и передавать их Богу в качестве параметров, а затем позволять Ему (хихикать) и Его ViewModel иметь дело с особенностями выполнения этих проектов.
Любые другие предложения, которые я хотел бы услышать.
Спасибо!
5 ответов
Мой предпочтительный способ получения ViewModels - это использование ViewModelLocater. По сути, это объект God, который вы подразумеваете, но единственной обязанностью является создание каждой модели ViewModel и сохранение ссылки на нее. Я обычно добавляю VML к ресурсам приложения, и каждое представление отвечает за установку его DataContext для правильного ViewModel. Если вы подписываетесь на несколько событий, вы можете либо подключить их VML вручную, либо создать виртуальную машину, которая сначала выдает события и передает ее зависимой виртуальной машине в своем конструкторе.
Взгляните на некоторые структуры внедрения зависимостей, такие как Unity (которую использует CAL), Castle Windsor или Spring.NET.
Эти проблемы довольно хорошо решаются с помощью библиотеки 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 поддерживает шаблон-посредник, называемый "агрегатором событий". По сути, вы можете публиковать и подписываться на сообщения через агрегатор событий из ваших viewmodels. Это позволяет моделям представления свободно общаться через сообщения, а не узнавать друг о друге и перехватывать события.
Призма защищает и поддерживает шаблоны для разработки компонентов независимо друг от друга в слабо связанной манере, без введения объектов Бога и чрезмерной связи. Большая часть Prism - это использование IOC и внедрение зависимостей, поэтому модульное тестирование также становится намного проще.
Я нашел следующую статью хорошим практическим введением в использование Prism и MVVM:
Вы можете использовать Controllers (ApplicationController, Use-Case Controllers) вместо класса "Бог". Контроллеры ответственны за создание объектов ViewModel, и они являются посредниками между ними.
Как это работает, показывает проект WPF Application Framework (WAF).
Надеюсь, я хорошо понял ваш вопрос. Я думаю, что использование God ViewModel не очень хорошая идея. Лучше иметь одну модель представления для каждого из ваших представлений и создавать экземпляры всех связанных моделей представления в этой модели представления. затем вы можете использовать посредник для отправки сообщения между моделями представления этого представления и другими представлениями, safly. Также я предлагаю использовать команды wpf вместо событий. Вы можете найти большую статью о посреднике здесь.