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

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

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

6 Solutions collect form web for “Как реализовать 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 это дополняется проектом призмы

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

  • Простая анимация с использованием C # / Windows Forms
  • Сохранить окно сверху и украсть фокус в WinForms
  • конвертировать шестнадцатеричный код в имя цвета
  • как отложить выключение и запустить процесс в службе windows
  • Добавить элемент в элемент управления Listview
  • Как отобразить форму Windows в полноэкранном режиме на панели задач?
  • Как вернуть значение из формы в C #?
  • Как мне группировать переключатели Windows Form?
  • Попытка использования classа C # SpellCheck
  • Как использовать индикатор выполнения WinForms?
  • как изменить цвет заголовка Winform DataGridview?
  • Interesting Posts

    Chrome / Safari не заполняет 100% высоту гибкого родителя

    Как обращаться со схемой URL по умолчанию

    Для чего используется hashCode? Это уникально?

    Возможно ли (и как) подключить док-станцию ​​молнии Belkin к Dell XPS 15 (с помощью молдинга usb-c)?

    Является ли мой Ubuntu установленным 32 или 64-битным?

    Как читать и копировать содержимое streamа вывода ответа сервлета HTTP для ведения журнала

    Как правильно отобразить системный раздел truecrypt?

    Ошибка HTTP 500.19 – Внутренняя ошибка сервера

    Java: BufferedImage для байтового массива и обратно

    Как избежать Не использовать stream приложений FX; currentThread = ошибка приложения JavaFX Application Thread?

    Ответ на входящий вызов с использованием android.telecom и InCallService

    Как включить динамический массив INSIDE a struct в C?

    Есть ли способ отключить автоматическую парковку жесткого диска?

    Как заблокировать определенный сайт с помощью файла hosts, даже если я подключен к VPN?

    Объединение фреймов данных на основе имен ростов в R

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