Разработка для 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-уведомлениями, аутентификации пользователей с использованием различных провайдеров аутентификации в применении к вашему приложению и подготовьте отчёт о проделанной работе.
Дополнительные материалы
К данной лабораторной работе подготовлено видеоприложение.