Как реализовать MVC в приложении Windows Forms?

Я не разрабатываю слишком много приложений для Windows / Windows Forms, но мне пришло в голову, что может быть полезно использовать шаблон MVC (Model View Controller) для разработки Windows Forms .NET.

Кто-нибудь реализовал MVC в Windows Forms? Если да, есть ли у вас какие-либо советы по дизайну?

То, что я делал в прошлом, использует нечто похожее, Model-View-Presenter .

[ПРИМЕЧАНИЕ. Эта статья была доступна в Интернете. Чтобы увидеть его сейчас, вам нужно загрузить CHM, а затем просмотреть свойства файла и нажать «Разблокировать». Затем вы можете открыть CHM и найти статью. Спасибо миллион, Microsoft! вздох ]

Форма представляет собой представление, и у меня есть интерфейс IView. Вся обработка происходит в презентаторе, который является просто classом. Форма создает нового ведущего и проходит в качестве IView ведущего. Таким образом, для тестирования вы можете перейти в поддельный IView вместо этого, а затем отправить команды ему из ведущего и определить результаты.

Если бы я использовал полнофункциональный Model-View-Controller, я бы сделал так:

  • Форма представляет собой вид . Он отправляет команды модели, поднимает события, которые controller может подписаться, и подписывается на события из модели.
  • Контроллер – это class, который подписывается на события представления и отправляет команды в представление и в модель.
  • Модель поднимает события, на которые подписывается вид.

Это соответствовало бы classической диаграмме MVC . Самым большим недостатком является то, что с событиями может быть трудно сказать, кто подписывается на что. Шаблон MVP использует методы вместо событий (по крайней мере, так, как я его реализовал). Когда form / view вызывает событие (например, someButton.Click), форма просто вызывает метод для ведущего для запуска логики для него. Вид и модель вообще не имеют прямого соединения; они оба должны пройти презентацию.

Ну, на самом деле Windows Forms реализует «бесплатный стиль» версии MVC, так же как некоторые фильмы воплощают какую-то дрянную «свободную» интерпретацию некоторых classических книг (Ромео и Джульетта приходят на ум).

Я не говорю, что реализация Windows Forms плохая, это просто … разные.

Если вы используете Windows Forms и надлежащие методы ООП и, возможно, ORM, такие как EntitySpaces для доступа к базе данных, то вы можете сказать, что:

  1. Инфраструктура ORM / ООП – это модель
  2. Формы – это представления
  3. Обработчики событий являются controllerом

Несмотря на то, что оба представления и controller, представленные одним и тем же объектом, затрудняют разделение кода из представления (нет простого способа подключить «GTK + view» в classе, полученном из Microsoft.Windows.Forms.Form).

Что вы можете сделать, если будете достаточно осторожны. Является ли код формы полностью отделен от вашего кода controllerа / модели, только записывая связанные с графическим интерфейсом элементы в обработчиках событий и всю другую бизнес-логику в отдельном classе. В этом случае, если вы когда-либо хотели использовать GTK + для записи другого слоя «Вид», вам нужно будет только переписать код GUI.

Windows Forms не разработан с нуля для использования MVC. У вас есть два варианта.

Во-первых, вы можете выполнить собственную реализацию MVC.

Во-вторых, вы можете использовать среду MVC, предназначенную для Windows Forms.

Первое просто начать делать, но чем дальше вы становитесь, тем сложнее он. Я бы предложил искать хорошую, ранее существовавшую и хорошо протестированную среду MVC, предназначенную для работы с Windows Forms. Я считаю, что это сообщение в блоге – достойная отправная точка.

Для любого начинающего, я предлагаю пропустить Windows Forms и разработать против WPF, если у вас есть опция. Это гораздо лучшая структура для создания пользовательского интерфейса. Для WPF существует много инфраструктур MVC, включая этот и тот .

Согласно Microsoft, блок приложений UIP, упомянутый @jasonbunting, «архивирован». Вместо этого просмотрите блок приложений Smart Client или еще более новую фабрику Smart Client Software Factory , которая поддерживает как WinForms, так и WPF SmartParts.

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

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

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

Для WPF это дополняется проектом призмы

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

  • Как форматировать столбцы DateTime в DataGridView?
  • Общий метод всех элементов управления
  • Как добавить новую строку в datagridview программно
  • Самая верхняя форма, нажатие «через» возможно?
  • Отображение подсказки при наведении курсора мыши на текст
  • Как получить доступ к управлению текстовым полем Winform из другого classа?
  • Доступ к управлению пользовательским интерфейсом из BackgroundWorker Thread
  • Как передать объект из формы1 в form2 и обратно в form1?
  • показать форму windows из windows службы
  • Показывать элементы управления, добавленные программно в приложении WinForms в представлении «Дизайн»?
  • C # Получить позицию элемента управления в форме
  • Interesting Posts

    Почему выходные дни Excel ошибочны в 1900 году?

    Noop для отчетов об исчерпывающих коммутаторах Swift

    Java: Самый эффективный метод для итерации по всем элементам в org.w3c.dom.Document?

    Установить проверку classа для динамического текстового поля в таблице

    Как вы выводите текущий путь элемента в XSLT?

    В чем разница между деревом parsingа и АСТ?

    Автоматическая замена моей тире заставляет меня грустить

    Количество строк, затронутых UPDATE в PL / SQL

    Можно ли указать путь в атрибуте для сопоставления свойства в моем classе с дочерним свойством в моем JSON?

    Маркировка / маркировка оконных файлов

    Мой tcpdump всегда фильтрует пакеты?

    Обработка кликов для всех элементов управления в форме

    Windows 10 linux bash shell ctrl + space не устанавливает отметку в Emacs

    Android: удалить левое поле из пользовательского макета панели действий

    Как я могу эффективно очищать стили на большом веб-сайте?

    Давайте будем гением компьютера.