Придайте мощь современным приложениям с помощью Windows Azure Mobile Services

OSzone.net » Microsoft » Разработка приложений » Облако/Azure » Придайте мощь современным приложениям с помощью Windows Azure Mobile Services
Автор: Рэчел Аппель
Иcточник: MSDN Magazine
Опубликована: 24.07.2013
Независимо от платформы, на которую вы ориентируетесь при публикации приложения, Windows Azure Mobile Services (WAMS) способен управлять приложениями для любых платформ. Это ключевой компонент платформы Windows Azure и серверная часть для разработки веб- и кросс-платформенных современных приложений. В этой статье я расскажу, как подготовить WAMS к работе в Visual Studio, дам обзор WAMS API и поясню, какой код необходим для создания современного приложения с применением WAMS.

Кросс-платформенная архитектура WAMS

Существует много сервисов Windows Azure, которые можно применять для управления данными и в качестве серверной части приложения, и не редкость, когда приложения используют более одного сервиса Windows Azure. Ниже перечислены некоторые из доступных сервисов.

Архитектура приложения будет зависеть от его требований. Если приложению нужно хранить большие объемы медийного или двоичного контента (например, десятки или сотни гигабайт данных), применение Windows Azure BLOB Storage скорее всего будет лучшим решением. Для большинства приложений, которые просто читают и пишут текстовые данные с какими-то сопутствующими картинками, WAMS является подходящим и простым решением. Многим приложениям приходиться иметь дело с унаследованными данными, поэтому миграция с SQL Server, SQL Server Compact Edition (SQL CE) или любого другого семейства баз данных Microsoft SQL непосредственно на SQL Azure может оказаться лучшим путем, если вам требуется DBA для администрирования данных.

Для большинства приложений WAMS вполне подходит, потому что он не только обеспечивает хранение данных, но и предоставляет полный набор сервисов на серверной стороне поверх базы данных, создаваемой в целях поддержки распространенных вариантов инфраструктуры приложений, где необходимы оповещающие уведомления (push notifications) и аутентификация.

Базовые сервисы WAMS

Следующие функции являются базовыми сервисами WAMS.

push.wns.sendToastText04(channel, { text1: item.text });
  1. Microsoft Account (провайдер аутентификации, ранее называвшийся как Windows Live ID);
  2. логин в Facebook;
  3. логин в Twitter;
  4. логин в Google.

WAMS предоставляет несколько библиотек для разработки различных Windows-приложений, включая библиотеку Windows Runtime (WinRT) для управляемых клиентов, клиентскую библиотеку Windows Library for JavaScript (WinJS) и Representational State Transfer (REST) API для всего — базовых сервисов, аутентификации и обмена сообщениями. Есть даже клиентские библиотеки для iOS и Android.

Применение WAMS API в проектах Windows Store или Windows Phone

Создаете вы приложение Windows Store или Windows Phone, код будет почти идентичным, а код на JavaScript очень похож на WinJS-код. Если у вас есть необходимые средства разработки и WAMS подготовлен и сконфигурирован (детали см. по ссылке bit.ly/NAAQz8), то написание кода для обращения к объектам и данным в мобильном сервисе — задача несложная, но отличающаяся от таковой в традиционных клиент-серверных или многоуровневых приложений. Это вызвано тем, что WAMS интегрируется с приложением так, что определенные изменения в модели приложения могут повлечь за собой изменения в нижележащих структурах данных. Другими словами, вы можете выбросить многие из традиционных SQL-выражений для определения данных и просто модифицировать члены класса, заново скомпилировать и запустить приложение, а потом проверить изменения на уровне базы данных. Кроме того, JavaScript занимает место SQL как синтаксис для повседневных задач поддержки базы данных, таких как запуск скриптов проверки или создание ограничений. Возможность скриптового управления изменениями в базе данных из приложения, командной строки и утилиты веб-администрирования ускоряет процесс создания приложения.

Пространство имен Microsoft.WindowsAzure.MobileServices предоставляет стандартный доступ к объектам в мобильном сервисе или его нижележащей базе данных SQL Azure. В следующем примере кода создается экземпляр MobileServiceClient:

public static MobileServiceClient MobileService = new MobileServiceClient(
"https://your-very-own-service-url.azure-mobile.net/",
"your-very-own-key-that-is-a-gigantic-string-of-characters-and-numbers"
);

Как видите, ваши URL и ключ WAMS-приложения являются параметрами конструктора MobileServiceClient. Чтобы найти эти URL и ключ, войдите в портал Windows Azure и перейдите в своему мобильному сервису, затем щелкните значок облака слева от элемента меню в информационной панели.

В предыдущем примере кода класс MobileServiceClient ведет себя в какой-то мере подобно объекту соединения, но безо всяких докучливых методов открытия и закрытия из эпохи объекта SqlConnection. Класс MobileServiceClient управляет соединениями за вас. Если ваши данные общедоступны, тогда вам не требуется вызывать метод MobileServiceClient.login — вы и без него сможете обращаться к таблицам, выполнять запросы и сортировать данные. Конечно, более сложные или связанные с безопасностью операции могут потребовать указания удостоверений.

Получив действительный экземпляр класса MobileServiceClient, вы можете использовать GetTable<T> для взаимодействия с нижележащей WAMS-таблицей:

private IMobileServiceTable<Person> personsTable =
  MobileService.GetTable< Person>();

Параметр-тип T в IMobileServiceTable<T> заставляет компилятор анализировать свойства и информацию об этом параметре (в данном случае о классе Person на рис. 1), сопоставляя его с нижележащей таблицей на уровне базы данных. Это позволяет добавлять или модифицировать свойства в ходе разработки и наблюдать за тем, как изменения в схеме отражаются в облаке в период выполнения. Однако изменения в схеме на уровне базы данных не вносятся автоматически при каждом изменении в коде. Например, добавление свойства в код на рис. 1 приведет к созданию нового поля в таблице, а удаление существующего свойства не вызовет операцию удаления.

Рис. 1. Класс Person

// Код модели данных/класса
public class Person
{
  public int Id { get; set; }
  public string Name { get; set; }
  [DataMember(Name = "Birthday")]
  public DateTime Date { get; set; }
  public string Picture { get; set; }
  public string Notes { get; set; }
}

GetTable<T> возвращает объект IMobileServiceTable, который представляет нижележащую таблицу в WAMS и содержит методы для сервисов вставки, обновления, удаления и сортировки:

// Выполняем асинхронное удаление,
// где item имеет тип Person (см. рис. 1)
await itemsTable.DeleteAsync(item);
// Выбираем конкретные записи с помощью LINQ-запроса
var people = personsTable.Select(p => p.Birthday > DateTime.Now.AddDays(14));

Вы можете создать свой уровень данных в коде, создав собственный класс, имена членов которого совпадают с именами полей таблицы. Этот метод известен под названием «соглашение превыше конфигурации» (convention over configuration); он позволяет сократить раздутый XML-код конфигурации и отдать предпочтение согласованности в именовании, что уменьшает объем кода и упрощает его сопровождение. Например, класс и схема на рис. 1 демонстрируют, что код клиентского класса сопоставляется с WAMS-таблицей и ее членами.

Код на рис. 1 создает схему базы данных, показанную в табл. 1.

Табл. 1. Соглашение превыше конфигурации требует соответствия кода класса именам в схеме базы данных

ПолеТип
IdSQL Bigint
NameString
DateDateTime
PictureString
NotesString


WAMS логически распознает типы данных по типу данных свойств в коде. Однако некоторые типы нельзя представить атрибутами данных, особенно изображение и двоичные данные. То есть, когда вы хотите сохранить изображение, вы должны использовать Windows Azure BLOB Storage, так как оно более масштабируемое, дешевле и работает намного лучше, чем его альтернатива, которая заключается в кодировании изображения по базе Base64 в строку с последующим помещением ее в WAMS-таблицу. Windows Azure BLOB Storage имеет REST API и управляемый API, поэтому разработчики могут легко обращаться к сервисам на разных платформах.

Для выполнения операций вставки, обновления и удаления просто создайте экземпляр собственного объекта и вызовите соответствующий метод из вашего объекта IMobileServiceTable:

Person person = new Person {
  Name = "Alan Turing",
  Birthday = DateTime dte = new DateTime(1912,6,23),
  // Кодирование изображения осуществляется
  // где-то в другом месте кода
  Picture = base64string,
  Notes = "A father of modern computer science." +
    " There is a test named after him that I fail regularly"};
await personsTable.InsertAsync(person);

Поскольку вызов InsertAsync со всей очевидностью является асинхронным, он не блокирует UI-код, и вы можете управлять данными в фоне, не мешая работе пользователя. Приложения Windows Store и Windows Phone работают в асинхронном режиме по умолчанию, так как гарантировать надежную связь можно далеко не всегда.

Если вы работаете в XAML, то можете задействовать связывание с данными вызовом метода ToListAsync объекта IMobileServiceTable. Этот метод подготавливает данные и возвращает их в объект, который связывает WAMS-таблицы с XAML-элементами ListView, как демонстрирует следующий пример кода:

var results = await todoTable.ToListAsync();
items = new ObservableCollection<TodoItem>(results);
ListItems.ItemsSource = items;

Этот код похож на традиционный код связывания с данными в Microsoft .NET Framework. Кроме того, можно вызывать методы объекта IMobileServiceTable для возврата IList<T> или IEnumerable<T>, если вы хотите вручную перебирать данные вместо привязки к ним.

Управление дополнительными средствами WAMS

Конечно, вам потребуется администрировать и управлять мобильным сервисом, его данными, безопасностью и выполнять все рутинные операции, связанные с поддержкой на серверной стороне, поскольку не все эти операции следует делать в приложении. К счастью, WAMS предоставляет несколько вариантов для выполнения административных задач на серверной стороне.

В WAMS включен краткий, но полный справочник по WAMS-скриптам для серверной стороны (bit.ly/XvsVec). Вы можете выполнять команды из утилиты командной строки или с портала Windows Azure. В командной строке просто введите команду azure mobile, чтобы увидеть список всех доступных команд, и azure mobile list для перечисления всех ваших мобильных сервисов.

Как и код вашего приложения, скриптовые функции на серверной стороне «регистрируются» в таблице по соглашениям об именовании, поэтому сигнатуры скриптов должны совпадать с сигнатурами методов для операций вставки, чтения, обновления и удаления. Вот сигнатуры скриптов на JavaScript для манипуляций над данными:

Заметьте: все, что вам нужно, включается как параметры метода, т. е. строка данных, идентификация пользователя и сам запрос. Это позволяет использовать защиту на уровне строк, а также выполнять любой тип серверных правил, скажем, проверку данных при соответствующих операциях.

В качестве примера вы могли бы выполнять проверку для ограничения длины вставляемой строки. Для этого используйте такой код:

function insert(item, user, request) {
  if (item.text.length > 20) {
    request.respond(statusCodes.BAD_REQUEST,
    'The length of the input text must be less than 20');
  } else {
    request.execute();
    }
}

Хотя эти скрипты можно модифицировать на портале Windows Azure, вы можете делать то же самое в предпочитаемом вами текстовом редакторе и сохранять файлы с расширением .js, например person.insert.js. Затем подготовленные скрипты можно загрузить на серверную сторону через командную строку командой со следующим синтаксисом и сигнатурой:

azure mobile script upload <service-name> table/<table-name>.<operation>.js

Команда для загрузки предыдущего скрипта-примера выглядела бы следующим образом (где NotablePeople — имя сервиса, а person — имя таблицы):

azure mobile script upload NotablePeople table/person.insert.js

Как и следовало бы ожидать, ошибку при проверке можно захватывать выражением try/catch на любом языке клиентской стороны.

Увы, в этот момент SQL-разработчики могут почувствовать себя отставшими от жизни из-за всех этих новейших тенденций с серверным JavaScript, но им станет привычнее при использовании SQL внутри скриптового объекта mssql, даже если он смешивается с JavaScript:

mssql.query('select * from people', {
  success: function(results) {
    console.log(results);
  }
});

Это особенно полезно, если у вас есть опыт корпоративных разработок, изобилующих SQL-кодом, так как он сильно отличается от динамической природы JavaScript.

В заключение хотелось бы отметить, что WAMS — это полный набор сервисов на серверной стороне для быстрой разработки кросс-платформенных приложений. Все сервисы Windows Azure, кроме SQL Azure, автоматически реализуют URL, дружественные к REST, а поскольку REST является кросс-платформенным, нет нужды заботиться о том, сможет ли архитектура вашего приложения и в будущем поддерживать новые клиентские устройства или пользовательские агенты. Тем временем, работа с WAMS не требует установки никакого изощренного ПО на клиенте благодаря мощным средствам веб-администрирования и командной строки, а также простым в использовании API для всех операций — от базового хранения данных до массовых рассылок по электронной почте и оповещающих уведомлений.


Ссылка: http://www.oszone.net/21388/