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";
}
}
Ответы
Ответ 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 должна содержать основы, которые вы ищете.