Как реализовать MVC в приложении Windows Forms?
Я не разрабатываю слишком много приложений для Windows/Windows Forms, но мне пришло в голову, что может быть полезно использовать шаблон MVC (Model View Controller) для разработки Windows Forms.NET.
Кто-нибудь реализовал MVC в Windows Forms? Если да, есть ли у вас какие-либо советы по дизайну?
Ответы
Ответ 1
То, что я делал в прошлом, использует нечто похожее, Model-View-Presenter.
[ПРИМЕЧАНИЕ. Эта статья была доступна в Интернете. Чтобы увидеть его сейчас, вам нужно загрузить CHM, а затем просмотреть свойства файла и нажать "Разблокировать". Затем вы можете открыть CHM и найти статью. Спасибо миллион, Microsoft! Вздох]
Форма представляет собой представление, и у меня есть интерфейс IView. Вся обработка происходит в презентаторе, который является просто классом. Форма создает нового ведущего и проходит в качестве ведущего IView. Таким образом, для тестирования вы можете передать поддельный IView вместо этого, а затем отправлять команды от ведущего и обнаруживать результаты.
Если бы я использовал полнофункциональный Model-View-Controller, я бы сделал так:
- Форма представляет собой представление . Он отправляет команды модели, поднимает события, которые контроллер может подписаться, и подписывается на события из модели.
- Контроллер - это класс, который подписывается на события просмотра и отправляет команды в представление и в модель.
- модель создает события, на которые подписывается вид.
Это будет соответствовать классической диаграмме MVC. Самым большим недостатком является то, что с событиями может быть трудно сказать, кто подписывается на что. Шаблон MVP использует методы вместо событий (по крайней мере, так, как я его реализовал). Когда form/view вызывает событие (например, someButton.Click), форма просто вызывает метод для ведущего для запуска логики для него. Вид и модель вообще не имеют прямого соединения; они оба должны пройти презентацию.
Ответ 2
Ну, на самом деле Windows Forms реализует "свободную стили" версию MVC, так же как некоторые фильмы воплощают какую-то дерьмовую "свободную" интерпретацию некоторых классических книг (Ромео и Джульетта приходят на ум).
Я не говорю, что реализация Windows Forms плохая, это просто... разные.
Если вы используете Windows Forms и надлежащие методы ООП и, возможно, ORM, такие как EntitySpaces для доступа к базе данных, вы можете сказать, что:
- Инфраструктура ORM/OOP - это модель
- Формы - это представления
- Обработчики событий - это контроллер
Несмотря на то, что оба представления и контроллер, представленные одним и тем же объектом, затрудняют разделение кода из представления (нет простого способа подключить "GTK + view" в классе, полученном из Microsoft.Windows.Forms.Form).
Что вы можете сделать, если вы достаточно осторожны. Является ли код формы полностью отделен от вашего кода контроллера/модели, только записывая связанные с графическим интерфейсом элементы в обработчиках событий и всю другую бизнес-логику в отдельном классе. В этом случае, если вы когда-либо хотели использовать GTK + для записи другого слоя "Вид", вам нужно будет только переписать код графического интерфейса.
Ответ 3
Windows Forms не разработан с нуля, чтобы использовать MVC. У вас есть два варианта.
Во-первых, вы можете выполнить собственную реализацию MVC.
Во-вторых, вы можете использовать среду MVC, предназначенную для Windows Forms.
Первое проще начать делать, но чем дальше вы становитесь, тем сложнее он. Я бы предложил искать хорошую, ранее существовавшую и хорошо протестированную среду MVC, предназначенную для работы с Windows Forms. Я верю, что этот пост в блоге является достойной отправной точкой.
Для любого, кто начнет работу, я предлагаю пропустить Windows Forms и перейти к WPF, если у вас есть опция. Это гораздо лучшая структура для создания пользовательского интерфейса. Для WPF существует много инфраструктур MVC, в том числе этот и что один.
Ответ 4
Согласно Microsoft, блок приложений UIP, упомянутый @jasonbunting, "архивирован". Вместо этого просмотрите Smart Client Application Block или еще более новый Smart Клиентское программное обеспечение Factory, которое поддерживает как WinForms, так и WPF SmartParts.
Ответ 5
Зайдите в Application Application Process (UIP) Application Block. Я мало что знаю об этом, но посмотрел на него несколько лет назад. Могут быть более новые версии, проверьте.
"Блок приложений UIP основан на шаблоне модели-представления (MVC).
Ответ 6
Взгляните на блок приложений MS Patterns and Practices Smart Client, в котором есть некоторые рекомендации и классы, которые помогут вам внедрить презентацию презентатора модели в формах окон - посмотрите на прилагаемое ссылочное приложение.
Для WPF это переопределяется призмой project
Подход программных заводов - отличный способ изучить лучшие практики.