Подтвердить что ты не робот

MVC С# - Простейшая возможная реализация

Моя первая попытка MVC. Я пытаюсь реализовать простой пример. Вдохновение от здесь. У меня есть этот шаблон (пока!)?

  • Просмотр: "Эй, контроллер, пользователь просто сказал мне, что хочет первого человека"

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

  • Модель: "Первый человек... получил это. Вернемся к вам, Контролер".

  • Контроллер: "Здесь я собираю новый набор данных. Вернуться к вам, просмотрите".

  • Вид: "Круто, сейчас я покажу первого человека пользователю".

Вид:

namespace WinFormMVC
{
    public partial class Form1 : Form
    {
        controller cont = new controller();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = cont.checkPermissionsAndGetFirstPerson();
        }
    }
}

Контроллер:

public class controller
    {
        public string checkPermissionsAndGetFirstPerson()
        {
            string returnValue = "";
            if (checkPermissions())
            {
                model m = new model();
                returnValue =  m.getFirstPerson();
            }

            return returnValue;

        }

        public bool checkPermissions()
        {
            return true;
        }
    }

Модель:

public class model
    {
        public string getFirstPerson()
        {
            return "Bill Smith";
        }
    }
4b9b3361

Ответ 1

Хмм... Я не уверен, буду ли я называть этот MVC... Как и в ASP.NET WebForm, эта форма больше похожа на шаблон MVP.

В соответствии с моим пониманием, в MVC контроллер является ответственным за управление всеми ресурсами и потоком кода. В вашем примере вы сначала создаете Windows Form (представление), а затем присоединяете к нему контроллер, который больше похож на MVP.

В классическом шаблоне MVC модель после создания экземпляра будет связана с представлением, и когда модель изменится, представление получит уведомление (возможно, через шаблон Observer/PubSub).

Щелчок на кнопке и т.д. из представления будет перенаправлен на контроллер, который будет координировать эти типы материалов.

см. this.

Ответ 2

Я бы описал MVC более как это:

  • Запрос (маршрутизация URL-адреса MVC, некоторое событие прошло от предыдущего пользовательского интерфейса и т.д.)

  • Контроллер - проверка учетных данных, получение данных, возврат модели

  • Модель - представляет данные, переданные с контроллера

  • Просмотр - отображение модели, возвращаемой контроллером. В зависимости от модели может отображаться пользовательский интерфейс для инициализации новых действий контроллера. Может также передать модель назад к следующему действию контроллера.

Я думаю, что это может быть немного запутано, потому что во многих реализациях Model (таких как Linq) они предоставляют определение и доступ к данным, но он все еще Контроллер, который знает, с чего начать (даже если это Модель, которая знает, как ее сохранить собственные изменения).

Итак, ваш код должен выглядеть примерно так:

//Controller:
public class PersonController
{
    public PersonAction Detail(int personId)
    {
        Person returnValue;
        //get person from DB and populate returnValue
        return new PersonAction( returnValue );
    }
}

//Model:
public class Person
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

//View:
public partial class PersonDetailView : MVCForm<Person>
{
    public Form1( Person model ):base(model) {
        textBox1.Text = model.FirstName + " " + model.LastName;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = model.FirstName + " " + model.LastName;
    }
}

В этом примере отсутствует структура, которая делает все это возможной - для этого есть две существенные части:

  • Что-то, что принимает/анализирует параметры и на основе этого вызывает метод действия контроллера. Например, в Asp.net MVC это обработчики маршрутизации - вышеописанным вызовом был бы URL-адрес запроса://Person/Detail/personId

  • Что-то, что принимает результат от действия (PersonAction в примере выше) и находит правильный вид для отображения. В этом примере он откроет форму PersonDetailView и передаст ей модель Person.

Существует множество примеров фреймворков для реализации MVC для WinForms - одна из них может быть хорошей отправной точкой.

Ответ 3

Чтобы принять шаблон MVC, который вы хотите реализовать, выполните следующие действия:

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

Я согласен с Джимми, вы хотели бы интегрировать что-то вроде Observer в этот тип системы, чтобы его можно было использовать для модели информировать View, когда он изменяется, поэтому View может затем соответствующим образом обновить его.

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

Ответ 4

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

  • Пользователь: Привет, веб-приложение, могу ли я иметь ресурс в /people/ 1

  • Механизм маршрутизации: это означает, что вы управляете человеком. получить первого пользователя.

  • Пользовательский контроллер: модель, мне нужно, чтобы вы сделали мне запись пользователя для аутентифицированного пользователя и запись человека для первого лица.

  • Пользовательский контроллер: правый. Я знаю, что аутентифицированный пользователь является администратором, и человек существует. Поэтому верните пользователю доступ к пользователю.

  • Механизм рендеринга: создайте html из представления (шаблона) и объекта пользователя (данных)

Это сложно сделать в веб-формах. Я думаю, лучший способ - иметь страницу для каждого контроллера, и эта страница будет динамически выбирать и отображать пользовательский элемент управления. Один для каждого вида. В MVC важно, чтобы представление было немым. Все запросы обрабатываются непосредственно контроллерами, которые затем выбирают, какой вид использовать.

Ответ 5

Ваш метод checkPermissionsAndGetFirstPerson, вероятно, слишком много. Авторизация и выборка данных, вероятно, должны быть отдельными операциями.

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

Большая часть информации, которую вы найдете в MVC в .NET, будет для веб-приложений ASP.NET MVC. Возможно, вы захотите проверить проект WinFormsMVC на CodePlex, чтобы узнать, как кто-то другой справился с этой проблемой.

http://winformsmvc.codeplex.com/

Здесь другая реализация WinForms MVC на CodePlex. Похоже, он получил немного больше документации.

http://koosserymvcwin.codeplex.com/

Ответ 6

Вы можете найти этот урок очень полезным: http://nerddinnerbook.s3.amazonaws.com/Intro.htm. Написанный Скоттом Гатри, он очень хорошо объясняет рабочий процесс MVC. Часть 4 должна содержать основы, которые вы ищете.