Как бы вы реализовали MVC в приложении Windows Forms? - PullRequest
62 голосов
/ 23 сентября 2008

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

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

Ответы [ 6 ]

40 голосов
/ 23 сентября 2008

В прошлом я использовал нечто подобное: Model-View-Presenter .

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

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

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

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

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

19 голосов
/ 23 сентября 2008

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

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

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

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

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

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

17 голосов
/ 23 сентября 2008

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

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

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

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

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

4 голосов
/ 24 сентября 2008

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

2 голосов
/ 23 сентября 2008

Регистрация в прикладном блоке процесса пользовательского интерфейса (UIP) . Я не знаю много об этом, но смотрел на это несколько лет назад. Там могут быть более новые версии, проверьте.

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

1 голос
/ 23 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...