Внедрение MVC с помощью Windows Forms

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

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

Ответ 1

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

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

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

Лучшие сообщения, которые я видел на самом деле объяснение MVC и почему система MVC построена так, как она есть, является "Создайте свою собственную CAB" от Джереми Д. Миллера. После работы, хотя вы должны уметь лучше понимать свои варианты. Следует также рассмотреть руководство Microsoft Smart Client (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 (Model View View Model) Design Pattern для Winforms дает еще один вариант, который может облегчить преобразование в WPF, если это когда-либо понадобится. Magical.Trevor - еще один образец MVVM для Windows Forms, который также включает автоматическую привязку на основе имен свойств.


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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 5

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

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

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

Ответ 6

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

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