Реализация MVC с Windows Forms

102

Где я могу найти хороший пример того, как полностью реализовать шаблон MVC в Windows Forms?

Я нашел много руководств и примеров кода на различных сайтах (например, The Code Project и .NetHeaven), но многие из них более репрезентативны для шаблона наблюдателя, чем MVC. Поскольку приложение, которое я хочу разработать, предназначено для школьного проекта, я не хочу использовать такие фреймворки, как PureMVC или MVC # .

kjv
источник

Ответы:

115

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

  • Непосредственно разговаривать с базой данных (2 уровня)
  • Используйте бэкэнд, который был написан для данного приложения (3 уровня)
  • Используйте набор веб-сервисов, которые были написаны для использования многими приложениями и не могут быть изменены для вашего приложения. (Сервисно-Ориентированная Архитектура)
  • Обновления, выполняемые операциями CRUD
  • Обновления выполняются с использованием шаблона команд (отправка команд на внутренний сервер)
  • Много использований привязки данных / отсутствие привязки данных
  • Большинство данных представляют собой «подобные таблицы» (например, счета-фактуры), которые хорошо работают в стандартных элементах управления сеткой / нуждаются в настраиваемых элементах управления для большинства данных пользовательского интерфейса.
  • Один разработчик / команды из 10 или 20 разработчиков (только в UI)
  • Множество модульных тестов с использованием mocks и т. Д. / Без модульных тестов

Поэтому я не думаю, что можно создать одну реализацию MVC (или MVP), которая всегда хорошо подходит.

Лучшие сообщения, которые я видел, действительно объясняли MVC и почему система MVC построена именно так, - это серия Джереми Миллера «Создайте свой собственный CAB» . Поработав над этим, вы сможете лучше понять свои варианты. Также следует учитывать руководство Microsoft Smart Client (CAB / Microsoft Composite Application Block) . Это немного сложно, но может хорошо работать для подходящих приложений.

Выбор реализации MVC / MVP для проекта Winforms дает обзор, который стоит прочитать. Многим нравится PureMVC . Я никогда не использовал его, но я посмотрю на него в следующий раз, когда мне понадобится среда MVC.

« Presenter Первый » является подход к разработке программного обеспечения , которое сочетает в себе идеи Model View Presenter (MVP) шаблон проектирования и разработки через тестирование . Это позволяет вам начать с написания тестов на языке заказчика. Например:

«Когда я нажимаю кнопку« Сохранить », файл должен быть сохранен, а предупреждение о несохраненном файле должно исчезнуть».

У меня нет опыта использования «Presenter First», но я попробую, когда у меня будет возможность, так как это выглядит очень многообещающим.

Другие вопросы о переполнении стека, которые вы, возможно, захотите посмотреть, находятся здесь и здесь .

Если вы думаете об использовании WPF в любой момент, обратите внимание на шаблон Model-View ViewModel (MVVM) . Вот очень хорошее видео, на которое вам стоит взглянуть: Джейсон Долинджер о Model-View-ViewModel .

Шаблон проектирования MVVM (Model View View Model) для Winforms дает еще один вариант, который может облегчить преобразование в WPF, если когда-либо понадобится. Magical.Trevor - еще один пример MVVM для Windows Forms, который также включает автоматическую привязку на основе имен свойств.


Также спросите себя, почему вы используете MVC.

  • Вы хотите иметь возможность тестировать как можно больше кода?
  • Вы пытаетесь разрешить повторное использование как можно большего количества кода?
  • Вы пытаетесь упростить понимание кода?
  • 101 другая причина, которая может иметь значение для данного проекта.

Как только вы определитесь со своими целями , вам будет легче выбрать ту или иную реализацию.

Ян Рингроуз
источник
@AgnelKurian, CAB был набором примеров кода от Microsoft о том, как создавать приложения - теперь это в основном история.
Ian Ringrose
Ха-ха! Да, теперь я вспоминаю эти «Блоки приложений».
Agnel Kurian
45

ОБНОВЛЕНИЕ: в дополнение к моему предыдущему ответу ниже я предлагаю прочитать о подходе «Сначала докладчик» (особенно статьи в формате PDF)

Я бы рекомендовал MVP (на самом деле шаблон PassiveView) вместо MVC. Для этого вам действительно не нужны какие-то специальные фреймворки, просто вы организуете свой код.

Один из подходов (который я обычно использую) - разделить каждую форму окна на три объекта:

  1. Класс докладчика / контроллера - это то, с чего вы фактически начинаете при разработке формы. Именно здесь должна находиться большая часть / вся ваша «бизнес-логика».
  2. Интерфейс просмотра (IView), который содержит методы, свойства и события. Этот интерфейс - все, что докладчик знает о вашей форме.
  3. В конце, когда вы завершите реализацию презентатора и представления (включая модульные тесты), вы можете создать фактический класс формы и заставить его реализовать интерфейс IView. Тогда остается лишь добавить соответствующие элементы управления в форму и связать их с интерфейсом.

Пример кода (простой псевдокод, просто для иллюстрации):

interface IView
{
    string Username { get; set; }
    string Password { get; set; }

    event EventHandler LogOnButtonClicked;

    void InformUserLogOnFailed();
    void MoveToMainScreen();
}

class Presenter
{
    public Presenter(IView view)
    {
        this.view = view;
        view.LogOnButtonClicked += new EventHandler(OnLogOnButton);
    }

    private void OnLogOnButton()
    {
        // we ask some service to verify the username/password
        bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password);
        if (isLogOnOk)
            view.MoveToMainScreen();
        else
        {
            view.Username = "";
            view.Password = "";
            view.InformUserLogOnFailed();
        }
    }

    private IView view;
}

class Form : IView
{
    public Form()
    {
        presenter = new Presenter(this);
    }

    public string Username
    {
        get { return TextBoxUsername.Text; }
        set { TextBoxUsername.Text = value; }
    }

    public string Password
    {
        get { return TextBoxPassword.Text; }
        set { TextBoxPassword.Text = value; }
    }

    public void InformUserLogOnFailed()
    {
        MessageBox.Show("Invalid username or password.");
    }

    public void MoveToMainScreen()
    {
        // code for opening another form...
    }

    private Presenter presenter;
}
Игорь Брейц
источник
7
Это реализация варианта MVP под названием PassiveView. В пассивном представлении представление не должно выбирать своего ведущего. Для аналогичного примера (но с ДЕЙСТВИТЕЛЬНО пассивным видом) проверьте этот образец danieleteti.it/?p=221 (пример на языке Delphi)
Даниэле Тети
6

Вы смотрели PureMVC ? Я обнаружил, что никто не может прийти к единому мнению о том, как на самом деле выглядит MVC, когда они начинают создавать конкретную реализацию.

Обновление: вы можете создать свой собственный, начав с чего-то более простого, например, MobileMVC . Код Compact Framework должен компилироваться / запускаться нормально в Windows. Поскольку это школьное задание, я бы посоветовал вам потратить некоторое время на изучение того, как на самом деле работает MVC.

Брайан Литтл
источник
У меня есть школьное задание по очень простому приложению для управления книжным магазином, и я очень неохотно использую фреймворк вроде PureMVC. Ищу что-нибудь попроще.
kjv
3

Возможно, вы захотите взглянуть на Differential Execution .

Вот это в SourceForge

IMO, это значительное улучшение MVC, хотя это все еще довольно необычно.

Майк Данлэйви
источник
2

Хороший пример при прокатке собственной реализации MVC с помощью Windows Forms можно найти здесь . Исходный код прилагается.

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

Когда вы не ходите в школу, вы, вероятно, захотите использовать рамки, как рекомендуют другие плакаты.

Гэри Рэй
источник
2

Блок Microsoft Composite Interface Application начал свою жизнь как реализация MVC (среди других реализованных шаблонов). Тем не менее, релизная версия превратилась в реализацию MVP, которую можно утверждать как разновидность другой интерпретации концепции MVC.

Если вы хотите проверить код очень полной (и в некоторой степени сложной) реализации MVP, вы можете найти MS-CAB как один из компонентов Microsoft Smart Client Software Factory. Поставляется с исходным кодом. Вы можете найти это здесь . Удачи!

Руи Кравейро
источник