MVC C # - простейшая возможная реализация - PullRequest
26 голосов
/ 10 июля 2009

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

  1. Просмотр: «Эй, контроллер, пользователь только что сказал мне, что хочет первого человека»

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

  3. Модель: «От первого лица ... получил. Обратно к вам, Контролер».

  4. Контроллер: «Здесь я соберу новый набор данных. Обратно к вам, просмотр.»

  5. Просмотр: «Круто, сейчас я покажу пользователю первое лицо».

Вид:

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";
        }
    }

Ответы [ 6 ]

6 голосов
/ 10 июля 2009

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

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

  2. Контроллер - проверка учетных данных, получение данных, возврат Модель

  3. Модель - представляет данные, переданные обратно из контроллера

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

Я думаю, что это может быть немного запутано, потому что во многих реализациях Модели (таких как 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;
    }
}

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

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

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

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

6 голосов
/ 10 июля 2009

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

Насколько я понимаю, в MVC контроллер отвечает за управление всеми ресурсами и потоком кода. В вашем примере вы сначала создаете форму Windows (представление), а затем присоединяете к ней контроллер, который является чем-то вроде MVP.

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

Нажатие кнопки и т. Д. Из представления будет перенаправлено на контроллер, который будет координировать подобные вещи.

см .: это .

1 голос
/ 10 июля 2009

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

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

  2. Маршрутный движок: это означает, что вы контролируете человека. получить первого пользователя.

  3. Контроллер пользователя: Модель, мне нужно, чтобы вы получили запись о пользователе для аутентифицированного пользователя и запись о лице от первого лица.

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

  5. Механизм рендеринга: создание HTML-кода из представления (шаблон) и объекта персонажа (данные)

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

1 голос
/ 10 июля 2009

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

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

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

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

0 голосов
/ 10 июля 2009

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

0 голосов
/ 10 июля 2009

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

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

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

http://winformsmvc.codeplex.com/

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

http://koosserymvcwin.codeplex.com/

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