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

StackOverflow https://stackoverflow.com/questions/122388

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Раньше я использовал что-то подобное, Модель-Представление-Презентатор.

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

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

Если бы мне пришлось использовать полноценный Модель-Представление-Контроллер, думаю, я бы сделал это следующим образом:

  • Форма – это вид.Он отправляет команды модели, генерирует события, на которые может подписаться контроллер, и подписывается на события модели.
  • А контроллер — это класс, который подписывается на события представления и отправляет команды представлению и модели.
  • А модель вызывает события, на которые подписывается представление.

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

Другие советы

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

Я не говорю, что реализация Windows Forms плоха, просто...другой.

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

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

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

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

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

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

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

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

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

Согласно Microsoft, блок приложения UIP, упомянутый @jasonbunting, «архивирован». Вместо этого посмотрите на Блок приложений смарт-клиента или даже новее Фабрика программного обеспечения для смарт-клиентов, который поддерживает как WinForms, так и WPF SmartParts.

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

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

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

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

Подход «фабрик программного обеспечения» — отличный способ изучить лучшие практики.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top