Разработка для Windows Azure
Работа с мобильной службой Windows Azure реализована в коде файла MainPage.xaml.cs, его код приведен в Листинге 39.2. Обратите внимание на комментарии к коду, поясняющие его фрагменты.
using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using Microsoft.WindowsAzure.MobileServices; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using my_notes.Resources; namespace my_notes { //Объектное представление записи таблицы базы данных public class TodoItem { public int Id { get; set; } [JsonProperty(PropertyName = "text")] public string Text { get; set; } [JsonProperty(PropertyName = "complete")] public bool Complete { get; set; } } public partial class MainPage : PhoneApplicationPage { // MobileServiceCollectionView реализует интерфейс ICollectionView (это удобно для организации привязки к списку) и // интегрирован с вашей мобильной службой, что упрощает привязку данных к элементу управления ListView private MobileServiceCollection<TodoItem, TodoItem> items; //Ссылка на таблицу в базе данных с указанием типа элемента private IMobileServiceTable<TodoItem> todoTable = App.MobileService.GetTable<TodoItem>(); // Конструктор public MainPage() { InitializeComponent(); } //Асинхронный метод private async void InsertTodoItem(TodoItem todoItem) { // Этот код выполняет вставку в базу данных нового элемента типа TodoItem. Когда операция завершается // и мобильная служба присваивает записи Id, элемент добавляется в CollectionView await todoTable.InsertAsync(todoItem); items.Add(todoItem); } //Асинхронный метод private async void RefreshTodoItems() { // Этот код обновляет записи в списке, выполняя запрос к таблице TodoItems. // Благодаря запросу "завершенные" дела не выводятся try { //Получаем из таблицы записи с флагом Complete, установленным в значение false items = await todoTable .Where(todoItem => todoItem.Complete == false) .ToCollectionAsync(); } catch (MobileServiceInvalidOperationException e) { //Сообщение, выводимое при возникновении в ходе загрузки ошибки MessageBox.Show(e.Message, "Error loading items", MessageBoxButton.OK); } ListItems.ItemsSource = items; } //Асинхронный метод private async void UpdateCheckedTodoItem(TodoItem item) { // Этот код использует сведения о выполненной задаче TodoItem и обновляет базу данных. // После ответа MobileService элемент удаляется из списка await todoTable.UpdateAsync(item); items.Remove(item); } //Обработчик нажатия на кнопку обновления списка private void ButtonRefresh_Click(object sender, RoutedEventArgs e) { RefreshTodoItems(); } //Обработчик нажатия на кнопку сохранения элемента private void ButtonSave_Click(object sender, RoutedEventArgs e) { var todoItem = new TodoItem { Text = TodoInput.Text }; InsertTodoItem(todoItem); } //Обработчик установки флага, говорящего о завершении "дела" private void CheckBoxComplete_Checked(object sender, RoutedEventArgs e) { CheckBox cb = (CheckBox)sender; TodoItem item = cb.DataContext as TodoItem; item.Complete = true; UpdateCheckedTodoItem(item); } //Переопределенный метод, выполняющийся при переходе на страницу protected override void OnNavigatedTo(NavigationEventArgs e) { //Обновление списка записей RefreshTodoItems(); } } }Листинг 39.2. Код файла MainPage.xaml.cs
После того, как в App.xaml.cs мы подключились к мобильной службе, операции, которые касаются получения данных из таблицы базы данных, записи в базу, обновления записей, выполняются в привычном для C#-проекта стиле. Обратите внимание на то, что часть операций выполняется асинхронно – об асинхронности мы поговорим в дальнейшем, однако нужно отметить, что использование асинхронных методов обязательно для тех участков кода, где осуществляются операции, на выполнение которых может уйти достаточно много времени. Например, работа с мобильной службой через Интернет – это одна из таких операций. Мы не можем предсказать, как долго будут выполняться запросы к службе, поэтому выполнение подобных запросов в потоке пользовательского интерфейса недопустимо. Это приведет к тому, что интерфейс будет периодически отказываться реагировать на воздействия пользователя.
На странице MainPage.xaml имеется элемент управления LongListSelector с именем ListItems. Данные, соответствующие данным, хранящимся в таблице в мобильной службе, отображаются в этом списке с использованием механизма привязки данных. Для отображения данных используется шаблон (Листинг 39.3), который обеспечивает вывод флага, элемента CheckBox, с именем CheckBoxCompleted и описывает обработчик события, вызываемый при его изменении. Здесь применяется двусторонняя привязка данных. Шаблон обеспечивает и вывод текста с использованием привязки данных.
<phone:LongListSelector Grid.Row="4" Grid.ColumnSpan="2" Name="ListItems"> <phone:LongListSelector.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Name="CheckBoxComplete" IsChecked="{Binding Complete, Mode=TwoWay}" Checked="CheckBoxComplete_Checked" Content="{Binding Text}" Margin="10,5" VerticalAlignment="Center"/> </StackPanel> </DataTemplate> </phone:LongListSelector.ItemTemplate> </phone:LongListSelector>Листинг 39.3. Фрагмент кода страницы MainPage.xaml
Выводы
В этой лабораторной работе мы изучили проект приложения, реализующего работу с мобильными службами Windows Azure в приложениях для Windows Phone 8. Приложение взаимодействует со службой, используя класс MobileServiceClient, который предоставляет удобный интерфейс, скрывающий технические детали такого взаимодействия.
Задание
После того, как у вас имеется мобильная служба и вы понимаете работу кода, обеспечивающего взаимодействие приложения с мобильной службой, вы можете приступить к изучению других аспектов работы с Azure. Вы можете воспользоваться для этого ресурсами Центра экспертизы по Windows Azure (http://msdn.microsoft.com/ru-RU/ff380142).
Подумайте над тем, как вы можете использовать мобильные службы Azure в приложении, разработкой которого вы занимаетесь, рассмотрите возможности использования облачной базы данных, работы с Push-уведомлениями, аутентификации пользователей с использованием различных провайдеров аутентификации в применении к вашему приложению и подготовьте отчёт о проделанной работе.
Дополнительные материалы
К данной лабораторной работе подготовлено видеоприложение.