Реализация MVC с помощью Windows Forms - PullRequest
101 голосов
/ 17 марта 2009

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

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

Ответы [ 6 ]

112 голосов
/ 25 марта 2009

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

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

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

Лучшие посты, которые я видел на самом деле , объясняющие MVC и , почему система MVC построена такой, какая она есть, это серия "Build Your Own CAB" Джереми Д Миллер . Поработав над этим, вы сможете намного лучше понять свои возможности. Руководство Microsoft для интеллектуальных клиентов (CAB / Microsoft Composite Application Block) также следует учитывать. Это немного сложно, но может хорошо работать для приложений, которые хорошо подходят.

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

" Presenter First " - это подход к разработке программного обеспечения, который объединяет идеи шаблона проектирования Model View Presenter (MVP) и управляемую тестированием разработку . Это позволяет начать с написания тестов на языке заказчика. Например:

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

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

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

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

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


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

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

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

45 голосов
/ 26 марта 2009

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

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

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

  1. Класс докладчик / контролер - это то, с чего вы фактически начинаете разработку формы. Именно здесь должна находиться большая часть всей вашей "бизнес" логики.
  2. Интерфейс представления (IView), который содержит методы, свойства и события. Этот интерфейс all , который докладчик знает о вашей форме.
  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;
}
6 голосов
/ 17 марта 2009

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

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

3 голосов
/ 22 марта 2009

Возможно, вы захотите взглянуть на Дифференциальное выполнение .

Вот оно в SourceForge

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

2 голосов
/ 25 марта 2009

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

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

2 голосов
/ 25 марта 2009

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

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

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

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