Как реализовать 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, в том числе этот и что один.

Ответ 5

Зайдите в Application Application Process (UIP) Application Block. Я мало что знаю об этом, но посмотрел на него несколько лет назад. Могут быть более новые версии, проверьте.

"Блок приложений UIP основан на шаблоне модели-представления (MVC).

Ответ 6

Взгляните на блок приложений MS Patterns and Practices Smart Client, в котором есть некоторые рекомендации и классы, которые помогут вам внедрить презентацию презентатора модели в формах окон - посмотрите на прилагаемое ссылочное приложение.

Для WPF это переопределяется призмой project

Подход программных заводов - отличный способ изучить лучшие практики.