Mobile MVC Framework - Большое в малом
Рано или поздно в своей работе программист доходит до той точки, когда писать программы "на коленке" уже не имеет смысла, т.к. время - конечный ресурс и с каждым годом становится все более и более ценным. В таком случае полезным бывает использование уже существующих наработок как, непосредственно, для реализации того или иного функционала, так и для разработки архитектуры ПО.
Удачным и довольно эффективным способом сократить время, необходимое на разработку архитектуры, является использование шаблонов проектирования (design patterns).
Одним из довольно популярных в наши дни шаблонов проектирования является Model-View-Controller (MVC, Модель-представление-контроллер). Об использовании этого шаблона проектирования, в применении для разработки мобильных приложений на .NET Compact Framework, я расскажу в этот раз.
Итак, что нам дает MVC в общем? MVC позволяет разделить функционал приложения на три части:
- Model (Модель) - содержит только данные и "ничего больше не делает". На самом деле фраза в кавычках значит, что Model предоставляет API для получения данных, и API для реакции на запросы об изменении данных (обычно такие запросы приходят от контроллера), но на остальной функционал приложения или отдельного модуля, а также на функционал по отображению данных, модель не оказывает никакого влияния и даже не знает о них.
- Controller (Контроллер) - обрабатывает данные, введенные пользователем, и уведомляет Model и Controller о необходимости реакции на действия пользователя. Модель, в этом случае, может изменять состояние хранимых ею данных, а представление должно обеспечить отображение актуальных данных.
- View (представление) - отвечает за отображение актуальных данных, предоставляемых моделью. View - это то, что мы видим на экране, пользовательский интерфейс. При использовании шаблона MVC пользовательский интерфейс не может и не должен напрямую изменять данные. Он должен уведомлять контроллер о действии пользователя, а контроллер, если это необходимо, будет запрашивать изменение данных в модели.
Использование MVC позволяет уменьшить зависимости между компонентами системы таким образом, что изменения одного компонента приводит к минимальным изменениям в остальных.
Но довольно теории. Перейдем к рассмотрению примера использования MVC для разработки приложений на .NET Compact Framework. Оказывается, что все велосипеды уже изобретены до нас, и для мобильных приложений уже существует реализация паттерна MVC - Mobile MVC Framework, который, вместе с исходным кодом, доступен на CodePlex.
Здесь и далее все примеры будут использовать именно єту библиотеку для реализации MVC.
Итак, давайте начнем знакомство.
Первое, что необходимо сделать, это создать приложение на .NET Compact Framework. Для этого в Microsoft Visual Studio выбираем меню File -> New -> Project и создаем Smart Device Project на C#.
Указав название проекта, жмем OK. После этого необходимо выбрать тип приложения. Нам подходит "Device Application"
После того как наш проект создан, распаковываем исходный код Mobile MVC Framework в папку с решением.
Добавляем проект библиотеки Mobile MVC Framework в решение.
Для нашего приложения добавляем ссылку на проект библиотеки в References.
Отлично. Мы получили пустое приложение с одной формой. Теперь займемся внесением изменений.
Создаем новую форму. Это будет форма ввода имени пользователя и пароля при старте приложения.
На форму добавляем два компонента TextBox (для ввода имени пользователя и пароля), два компонента Label и в главное меню формы добавляем пункты OK и Exit.
Теперь выполним изменения в исходном коде формы.
Формы в приложении, использующем Mobile MVC Framework должны быть отнаследованы от класса ViewForm. Для этого меняем у нашей формы имя родительского класса.
using System; using System.Linq; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Mobile.Mvc; namespace MobileMVCTest { public partial class LoginForm : ViewForm { public LoginForm() { InitializeComponent(); } } }
По нажатию на кнопку OK наша форма будет отправлять уведомление контроллеру. Для того чтобы отправить уведомление о необходимости проверки логина и пароля, нам необходимо сохранить состояние формы. Состояние компонента сохраняется в переменной ViewData. Для уведомления контроллера используется метод OnViewStatChanged(). Каждое действие пользователя должно иметь уникальное имя, которое будет передано в качестве параметра в метод OnViewStatChanged(). Благодаря уникальному имени контроллер сможет идентифицировать действие пользователя и обработать его соответствующим образом. Уведомления от контроллера обрабатываются в методе OnUpdateView(). Все уведомления, приходящие от контроллера также будут иметь уникальные названия, с помощью которых форма сможет их идентифицировать и обработать.
Полный исходный код формы предствален ниже:
namespace MobileMVCTest { public partial class LoginForm : ViewForm { public LoginForm() { InitializeComponent(); } private void mnuOK_Click(object sender, EventArgs e) { ViewData["Login"] = txtLogin.Text; ViewData["Password"] = txtPassword.Text; OnViewStateChanged("LoginAction"); } private void mnuExit_Click(object sender, EventArgs e) { OnViewStateChanged("ExitAction"); } protected override void OnUpdateView(string key) { if(key == "LoginSuccess") { DialogResult = DialogResult.OK; Close(); } else if(key == "LoginError") { txtLogin.Text = string.Empty; txtPassword.Text = string.Empty; MessageBox.Show("Error"); } } } }
Редактирование формы мы закончили. Теперь нужно создать класс контроллера.
Основной код в классе контроллера сосредоточен в методе OnViewStateChanged(), который вызывается из главной формы. Если приходит уведомление о том, что пользователь нажал кнопку "OK", то выполняется проверка введенных данных. При соответствии данных форме отсылается уведомление "LoginSuccess", в противном случае уведомление "LoginError".
Если была нажата кнопка "Exit" (и в контроллер поступило уведомление "ExitAction"), то программа завершается.
using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.Mobile.Mvc; using System.Windows.Forms; namespace MobileMVCTest { class LoginController : Controller { public LoginController(IView view) : base(view) { } protected override void OnViewStateChanged(string key) { if(key == "LoginAction") { if( (View.ViewData["Login"].ToString() == "TestLogin") && (View.ViewData["Password"].ToString() == "TestPassword")) { View.UpdateView("LoginSuccess"); } else { View.UpdateView("LoginError"); } } if(key == "ExitAction") { Application.Exit(); } } } }
Все идеально и просто. Форма не знает, каким образом обрабатываются введенные данные. Она всего лишь сохраняет свое состояние и уведомляет об этом контроллер. Контроллер также ничего не знает о том, какие есть контролы на форме. Он также сохраняет состояние и уведомляет форму.
Теперь нам осталось всего лишь внести небольшие изменения в класс приложения:
using System; using System.Linq; using System.Collections.Generic; using System.Windows.Forms; namespace MobileMVCTest { static class Program { /// /// The main entry point for the application. /// [MTAThread] static void Main() { LoginForm loginForm = new LoginForm(); LoginController controller = new LoginController(loginForm); if(loginForm.ShowDialog() == DialogResult.OK) { Application.Run(new MainForm()); } } } }
Здесь мы создали форму и контроллер для нее. При успешном завершении работы формы (если данные об учетной записи пользователя были введены корректно) приложение продолжает свою работу. В противном случае приложение завершается.
Продолжение следует...
Эту, а также остальные части статьи о Mobile MVC Framework можно почитать здесь.
Компании из статьи
Microsoft Украина | Украинское подразделение компании Microsoft. |