94352

Cозданиt коммерческих приложений с использованием Silverlight

Научная статья

Информатика, кибернетика и программирование

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

Русский

2015-09-11

81 KB

0 чел.

Введение

Silverlight становится все более популярной технологией для создания клиентской части «насыщенных» web-приложений (Rich Internet Applications). На момент написания статьи процент её проникновения на рынок составляет около 64% [1]. Технология предоставляет широкие возможности по отображению анимации, визуальных эффектов, видео, аудио и графики с помощью web-браузера. Кроме этого, в анонсированной пятой версии появится поддержка аппаратного ускорения для отображения трехмерной графики и видео [2]. Для разработчика возможности не менее впечатляющие – это использование языков XAML и C# на платформе .Net в среде Visual Studio 2010, удобное кодирование видео в Expression Encoder, а также визуальное проектирование интерфейсов любой сложности в программах Expression Blend и Expression Design.

Несмотря на то, что программисту на Silverlight дается в помощь мощный арсенал инструментов, зачастую разработка протекает далеко не так гладко, как хотелось бы. Возьмём, к примеру, стили и шаблоны Silverlight. По-настоящему оценить мощь и удобство этих технологий можно только после осознания того, как они работают. Здесь путем переопределения стиля компонента можно превратить кнопку в отмечаемое поле (checkbox) или таблицу данных (datagrid), отобразить видео в качестве фона элемента управления или поместить графики в ветви дерева - возможности для создания интерфейса ограничиваются только фантазией разработчика. Вполне вероятно, что эти возможности не были ранее знакомы разработчику и их изучение потребует достаточного длительного времени. Однако после их освоения станет возможным быстрая разработка качественных web-приложений, которые по функциональности во многом не будут уступать настольным.

Цель данной статьи – рассказать об особенностях разработки приложений RIA с помощью технологий компании Microsoft , а также поделиться опытом автора по созданию коммерческих приложений с использованием Silverlight.

На данный момент производителем представлена финальная версия Silverlight 5, однако в статье будет идти речь о версии Silverlight 4, поскольку описываемые в статье особенности разработки одинаково актуальны для обеих версий технологии.

В статье рассматривается использование Silverlight в рамках классической трехзвенной архитектуры, состоящей из слоя данных, слоя прикладной логики и клиентского слоя. Клиентский слой в данном случае - это Silverlight-плагин для браузера ; слой прикладной логики – ASP.NET-сайт, на котором размещены веб-сервисы; слой данных – это СУБД MS SQL Server, а также система объектно-реляционного маппинга (ORM).

В рассматриваемой трехзвенной архитектуре главным элементом является, пожалуй, слой данных. Здесь хранятся бизнес-данные, ради доступа к которым создавалась вся система; на слой данных часто приходится наибольшая по сравнению с другими слоями вычислительная нагрузка; проектирование системы начинается с проектирования объектной модели, которая также отражается в слое данных в виде БД. Поэтому выбор технологии ORM очень важен - он может как облегчить разработку и сопровождение, так и существенно осложнить их. Итак, что же выбрать?

Доступ к данным

На сегодняшний день Microsoft предлагает для платформы .Net по крайней мере три технологии доступа к данным, рассмотрим каждую из них.

ADO.Net – это набор классов, предоставляющих службы доступа к данным программисту. ADO.NET имеет богатый набор компонентов для создания распределенных приложений, совместно использующих данные [3]. Данная технология очень популярна, т. к. она надежна и используется уже много лет. Кроме этого, для ADO.Net существует большое количество провайдеров данных, поэтому в качестве СУБД можно использовать различные продукты – MS SQL Server, Oracle Database, MySQL, FirebirdSQL и т. д. ADO.Net можно сопоставить паттерн Table Data Gateway (шлюз к данным таблицы), описанный М. Фаулером [25]. Посмотрим, как работает ADO.Net.

Доступ к объектам базы осуществляется путем передачи на сервер кода SQL, команд запуска хранимых процедур или функций. При использовании этой технологии для каждой операции выборки, вставки, удаления или изменения строк в таблицах, как правило, пишется своя хранимая процедура, которую в нужный момент запускают с помощью классов ADO.Net. Это упрощает обслуживание системы в тех случаях, когда доступен лишь сервер БД и нет возможности изменить код на клиенте. К сожалению, при этом можно изменить только логику хранимой процедуры, а не сигнатуру (количество и тип параметров), поскольку в последнем случае процедура не будет совместима с вызывающим её кодом. Программисту требуется написать не только логику работы с базой в виде триггеров, функций и процедур, но и методы для работы с этими объектами базы в коде приложения. Кроме этого, необходимо реализовать некоторое количество классов (т. н. сущностей), с помощью которых будет выполняться дальнейшая логика работы с данными - отображение значений в таблицах пользовательского интерфейса, сериализация в xml на веб-сервисе или запись в файл. Для того, чтобы упростить код, который выполняет обмен данными с базой, можно и нужно обобщать его – писать интерфейсы, абстрактные классы, различные универсальные методы. Однако чем абстрактнее такая система классов, тем больше времени нужно на её проектирование и разработку, что в общем делает дороже весь проект. Будут ли оправданными эти траты? Безусловно, если на разработку проекта выделены большие средства, а также сроки выполнения велики и особенно в тех случаях, когда во главу угла ставится скорость работы. Технология ADO.Net позволяет гибко выстроить работу с базой, т.к. SQL-запросы пишутся вручную, и их можно очень хорошо оптимизировать, тем самым повысив скорость выполнения запросов и уменьшив сетевой трафик.

Кроме описанных выше преимуществ, ADO.Net имеет и существенные недостатки. Самый главный – необходимость написания большого количества SQL-кода вручную. Кроме того, возникает необходимость ручного разбора результатов запросов, а также самостоятельного создания классов бизнес-сущностей. Все это увеличивает время разработки.

LINQ to SQL. В этой технологии модель данных реляционной базы данных сопоставляется объектной модели, выраженной в языке программирования разработчика. При запуске приложения LINQ to SQL преобразует запросы LINQ из объектной модели в SQL и отправляет их в базу данных для выполнения. Когда база данных возвращает результаты, LINQ to SQL преобразует их обратно в объекты, с которыми можно работать на собственном языке программирования [4]. LINQ to SQL можно сопоставить паттерн Active Record (активная запись), описанный М. Фаулером [26]. Для генерации набора классов, соответствующих сущностям БД, обычно используется встроенный в Visual Studio инструмент – ORM-дизайнер. С его помощью можно автоматически создать классы языка программирования (C# или Visual Basic .Net), которые можно использовать в дальнейшем для любых нужд. Все операции вставки, обновления, удаления записей в таблицах БД можно делать при помощи специального класса LINQ to SQL – контекста. Фактически, работа с базой данных превращается просто в работу с набором классов, где запросы формируются на языке C# (VB.Net) с использованием лямбда-выражений LINQ to SQL. Плюсы такого подхода – упрощается отладка, нет необходимости писать хранимые процедуры, все данные из базы доступны в виде сущностей и коллекций сущностей, которые могут быть сразу привязаны к компонентам пользовательского интерфейса, либо сериализованы для дальнейшей передачи через веб-сервис.

Вместе с этим, применение LINQ to SQL накладывает на систему некоторые ограничения – технология не поддерживает серверы БД, отличные от MS SQL Server, а также зачастую формирует не совсем оптимальные SQL-запросы.

LINQ to Entities — позволяет разработчикам создавать приложения для доступа к данным, работающие с концептуальной моделью приложения, а не напрямую с реляционной схемой хранения. Цель состоит в уменьшении объема кода и снижении затрат на сопровождение приложений, ориентированных на обработку данных. [5]. Технология схожа с LINQ to SQL, но имеет некоторые отличия. LINQ to Entities, в отличие от LINQ to SQL, поддерживает работу с СУБД, отличными от MS SQL Server [6] [7], в частности, с Oracle Database [8]. Технологии можно сопоставить паттерн Domain Model (модель области определения), описанный М. Фаулером [27]. Кроме этого, LINQ to Entities позволяет использовать модель сущностей, которая значительно отличается от соответствующей модели данных [6] [7], в то время как LINQ to SQL создает жесткую привязку генерируемых классов к таблицам базы данных: одна таблица – один класс. Фактически, структура модели LINQ to Entities не привязана к источнику данных – необходимо лишь проставить соответствия свойства генерируемых классов с реальными столбцами таблиц или представлений БД. Вместе с тем, LINQ to SQL позволяет использовать собственные классы сущностей, наследоваться от интерфейсов или базового класса сущностей. В LINQ to Entities такой возможности нет.

Можно сделать вывод, что использовать LINQ to Entities разумно в больших проектах со сложной структурой данных, а также в случаях, когда необходима поддержка сторонних СУБД (не MS SQL Server).

Как показывает опыт автора, времени на проектирование и написание кода, как правило, всегда мало – и архитекторы, и разработчики ищут пути наименьшего сопротивления. В большинстве ситуаций технология ADO.Net себя не оправдывала, и её применение в некоторых проектах было обусловлено совместимостью с ранее написанным кодом. Однако в силу достаточного большого возраста технологии, у разработчиков накоплено значительное количество наработок – фреймворков, оберток, вспомогательных классов, применение которых несколько сглаживает недостатки ADO.Net. В новых же проектах всегда использовались технологии LINQ to SQL или LINQ to Entities, в которых возможность автоматического создания классов из сущностей БД значительно уменьшило время разработки, сократило размер написанного кода, а также сделала его более понятным. Хорошо зарекомендовал себя комбинированный способ – на ASP.Net сайте системы, где размещается приложение Silverlight, использовать LINQ to Entities, т. к. часто необходимо создавать сложные сущности на основе уже имеющихся, и очень удобно редактировать модель прямо в ORM-дизайнере. Напротив, для служб, которые выполняют в фоне анализ данных и работают напрямую с БД, проще обойтись технологией LINQ to SQL, сущности которой жестко привязаны к сущностям базы.

Веб-сервисы

Определившись с технологиями доступа к данным и СУБД, необходимо выбрать также технологию обмена данными между сервером и клиентским приложением Silverlight – платформу веб-сервисов. На сегодняшний день разработчикам на .Net доступно несколько таких платформ, их выбор, как и в случае с выбором технологии доступа к данным, зависит от поставленных перед проектом задач. К выбору платформы веб - сервисов необходимо отнестись очень внимательно, поскольку от него во многом зависит успех разработки всей системы. Итак, рассмотрим основные технологии веб-сервисов, предложенные компанией Microsoft.

Windows Communication Foundation (WCF) представляет собой новое поколение коммуникационной инфраструктуры Microsoft, построенной на основе архитектуры веб-сервисов. Расширенная поддержка веб-сервисов в Windows Communication Foundation обеспечивает безопасную, надежную транзакционную систему передачи сообщений с возможностью реализации гетерогенных систем.

С точки зрения разработчика технология представляет собой набор классов, экземпляры которых размещаются в каком-либо процессе Windows. Чаще всего для этого используется процесс веб-сервера (IIS). При этом запрос к сервису осуществляется через URL, а передача - либо в формате xml, либо в двоичном виде. Для работы механизма необходимо создать в серверном проекте сервис WCF, а в клиентском (в данном случае это приложение Silverlight) - добавить ссылку на этот веб-сервис. Чтобы осуществить обмен данными между клиентом и сервером, необходимо, чтобы содержащие эти данные классы могли быть сериализованы. Как следствие, передать через сервис класс, сгенерированный, к примеру, дизайнером сущностей Entity Framework, нельзя. Для обхода этого ограничения нужно написать вспомогательный класс, у которого кроме всего прочего, передаваемые свойства помечены специальным атрибутом – DataContract . Помимо этого, если передаваемый класс содержит ссылку на еще один класс данных, то он также должен быть сериализуем. В результате для того, чтобы иметь возможность передавать данные, необходимо фактически переписать вручную структуру сущностей, сгенерированных дизайнером ORM. Такой подход оправдан при небольшом наборе сущностей, которые подлежат передаче через сервис, а также в сервисе, который вообще не использует классы данных, а служит лишь для управления некоторой серверной логикой (к примеру, получение серверного времени). Таким образом, при наличии сложной системы сущностей использование сервисов WCF значительно замедляет создание и доработку системы. Однако использование этой технологии оправдано в тех системах, где в основном требуется передавать созданные вручную классы или команды.

Службы WCF Data Services (которые раньше назывались «ADO.NET Data Services») — это компонент платформы .NET Framework, с помощью которого можно создавать службы, использующие Протокол Open Data Protocol (OData) для передачи и получения данных через Интернет или интрасеть с помощью семантики REST. Службы OData предоставляют данные в качестве ресурсов, доступ к которым осуществляется с помощью URI. Доступ и изменение данных производится с помощью таких стандартных команд HTTP, как GET, PUT, POST и DELETE. В службах OData используются соглашения связи сущностей модели Entity Data Model для предоставления ресурсов в виде наборов сущностей, связанных с помощью сопоставлений .

При использовании этой технологии роль слоя приложений фактически сведена к минимуму. Веб-служба выступает лишь как посредник между источником данных и клиентским приложением. В результате сложность разработки уменьшается – с клиентского приложения можно выполнить практически любой запрос к базе данных посредством WCF Data Services. Такой подход удобен в тех случаях, когда в клиентском приложении требуется лишь отображать данные соответствующих таблиц БД, а обработка данных на сервере минимальна или полностью отсутствует. Примером таких систем могут служить информационные панели в общественных местах - расписания транспорта, электронные очереди в банках и так далее. Однако в случаях, когда на сервере приложений планируется обрабатывать получаемые и возвращаемые веб-сервисом данные, либо когда веб-сервис должен содержать методы, не связанные с обменом данных с БД, применение данной технологии становится невыгодным..

WCF RIA Services. Службы WCF RIA упрощает разработку многоуровневых решений класса RIA (полнофункциональных интернет-приложений), таких как приложения Silverlight. Типичной проблемой при разработке многоуровневого решения RIA является согласование логики среднего уровня и уровня представления. Чтобы обеспечить максимальное взаимодействие с пользователем, клиент Службы RIA должен учитывать логику приложения, которое находится на сервере. Однако было бы нежелательным разрабатывать и поддерживать одну и ту же логику приложения как на уровне представления, так и на уровне логики приложения. Службы RIA решает эту проблему, поскольку в составе платформы имеются компоненты, инструменты и службы, обеспечивающие доступ клиента Службы RIA к логике приложения на сервере без необходимости вручную дублировать эту программную логику. Можно создать клиент Службы RIA , учитывающий бизнес-правила, и при каждой компиляции решения эта логика будет автоматически обновляться на клиенте. На рисунке 1 показана упрощенная версия многоуровневого приложения. Службы RIA посвящены в основном решению задач в прямоугольнике между уровнем представления и уровнем доступа к данным (DAL) и позволяет упростить разработку многоуровневого решения с клиентом Службы RIA .


Рис.1. Схема работы RIA

Как можно видеть, преимуществами технологии является автоматическая генерация сериализованных классов на основе контекста данных LINQ to SQL или LINQ to Entities на сервере и клиенте, а также автоматическая синхронизация серверного и клиентского контекстов при построении проектов. Помимо этого, существует возможность создавать пользовательские методы, возвращающие созданные вручную сущности (члены классов должны быть помечены атрибутом сериализации, как в WCF Services). Таким образом, технология соединяет в себе преимущества WCF Services и WCF Data Services. Помимо этого, необходимо отметить легкость, с которой можно создать контекст аутентификации. В распоряжении разработчика оказывается функциональный шаблон сервиса аутентификации, код которого также автоматически синхронизируется с кодом клиентского приложения, что значительно упрощает разработку.

WCF RIA Services использует для обмена данными с клиентами Silverlight технологию SOAP, передавая данные в двоичном виде. Это затрудняет возможную кражу информации и уменьшает объём трафика. Однако с остальными клиентами используется xml-формат SOAP для передачи данных.

Службы WCF RIA в настоящее время оптимизированы для работы с клиентом Silverlight в том смысле, что поддерживает автоматическое создание кода для учетной записи-посредника Silverlight. Однако служба домена может быть вызвана и из других клиентов .NET, таких как клиент ASP.NET . Иными словами, технология была создана с учетом особенностей работы с Silverlight-клиентом.

Среди упомянутых технологий веб-сервисов для Silverlight-клиентов по мнению автора следует предпочесть WCF RIA Services. По сравнению с другими упомянутыми технологиями, использование этой технологии позволяет сократить время разработки за счет автоматической генерации системы сущностей на клиенте с возможностью отслеживания изменений в этой системе. В данной статье не рассматривалась ASP.NET Web Services, так как эта технология сохраняется лишь для обеспечения обратной совместимости с существующими приложениями и её не рекомендуется использовать для разработки новых приложений.

Клиентская модель данных

В Silverlight, как и в любом RIA-клиенте, обмен данными асинхронный. Это обстоятельство часто значительно снижает скорость разработки по сравнению с обычными настольными приложениями, которые используют архитектуру «клиент-сервер». При асинхронном обмене данными запуск запроса к веб-сервису и получение результата выполняется не по очереди, а с некоторой задержкой, при этом после выполнения запуска запроса текущий поток продолжает выполняться, не дожидаясь ответа от сервера. Ответ приходит в любое время, а обработкой его результатов (к примеру, коллекции с данными) должен заниматься делегат, который был подписан на событие ответа по этому запросу. Однако в ходе запроса могут возникнуть ошибки – исключение в коде веб-сервиса, потеря связи с сервером, недоступность БД и т. д. При этом, в отличие от системы с синхронным выполнением запросов, исключение возникает не в методе запуска запроса, а передается как аргумент делегату. Как результат, отлавливать ошибки необходимо уже в двух местах – в коде старта запроса и в делегате завершения выполнения запроса. Конечно, сделать эту работу нетрудно, но, как показывает практика, запросов в системе может быть несколько десятков или сотен – при таком положении дел сильно возрастает сложность отладки. Чтобы решить проблему, можно абстрагироваться от конкретных запросов, и написать систему классов, которая позволит легко обмениваться с веб-сервисом любыми типами данных. Такие классы значительно упростят расширение системы – добавление новых запросов будет требовать написания минимального количества кода. Безусловно, разработка упомянутой системы классов оправдана лишь для достаточно крупных систем, либо в случае разработки нескольких типовых проектов. Подобная система классов может является клиентским фреймворком – он может быть использован повторно в других проектах на Silverlight.

Один из вариантов клиентского фреймворка предлагает паттерн MVVM – «модель-представление-модель представления» (Model-View-ViewModel). В 2005 году Джон Госсман (John Gossman), один из архитекторов WPF и Silverlight в корпорации Microsoft, рассказал в своем блоге об этом паттерне. MVVM совпадает с моделью презентации (PM ) Фаулера в том плане, что оба шаблона содержат абстракцию представления, содержащую состояние и поведение представления. Фаулер ввел модель презентации как способ создания независимого от платформы пользовательского интерфейса абстракции представления, а Госсман предложил MVVM как стандартизированный способ использовать основные функции WPF для упрощения создания пользовательских интерфейсов. В этом смысле MVVM - частный вариант более общего шаблона PM, приспособленным для платформ WPF и Silverlight.

Использование этого паттерна позволяет отделить логику приложения от графического интерфейса, что дает возможность разрабатывать то и другое независимо друг от друга. Описанные выше классы фреймворка могут служить базовыми моделями паттерна MVVM, и содержать весь набор типовых операций по асинхронной загрузке и отправке данных. С учетом того, что в Silverlight существует мощная система связывания данных (data binding), реализовать в Silverlight подобный паттерн довольно легко. Абстракция классов и применение MVVM сильно упростит будущую работу по расширению функциональности, добавлению новых сущностей и бизнес-логики. Начальное падение скорости разработки, связанное с проектированием абстрактных моделей, будет скомпенсировано скоростью последующей разработки новых модулей. Таким образом, использование MVVM тем более оправдано, чем больше сложность клиентской части системы.

Особенности разработки базы данных

Большинство современных информационных систем трудно представить без базы данных. Их проектированию просвещено множество литературы, например, книга К. Дж. Дейта «Введение в системы баз данных» [22]. Однако существуют моменты, на которых следует обратить особое внимание.

В контексте использования Silverlight, LINQ to SQL и Entity Framework как СУБД наиболее предпочтительна MS SQL Server. Развертывание и настройка продуктов этой линейки несложно, а с помощью SQL Management Studio можно создавать таблицы и представления c помощью графического интерфейса, практически не используя язык SQL. Для удобства работы с объектами БД, а также для корректного формирования имен соответствующих классов ORM-модели, имеет смысл давать объектам БД имена в нотации Паскаль, где каждое слово начинается с заглавной буквы, например UserProfileSetting. Кроме этого, названия объектов БД должны быть единственного числа - к примеру, если в таблице предполагается хранить список устройств, следует назвать ее Device, а не Devices. Это позволит избежать путаницы после того, как ORM-дизайнер сгенерирует классы сущностей – класс, отражающий сущность, будет назван единственным числом (Device), а коллекция таких сущностей – множественным (Devices).


 

А также другие работы, которые могут Вас заинтересовать

8540. Диалектика абсолютной и относительной истины 15.98 KB
  Диалектика абсолютной и относительной истины. Истина - такое знание, которое отражает объективную реальность предмета, процесса, явления такими, какими они есть на самом деле. Истина объективна, это проявляется в том, что содержание нашего знания не...
8541. Агностицизм и его разновидности 16.42 KB
  Агностицизм и его разновидности Агностицизм (от греч. - недоступный познанию) - учение, отрицающее полностью или частично возможность познания мира. Термин введен английским естествоиспытателем Гексли, однако выражение позиции агностицизма...
8542. Философия как феномен культуры 18.4 KB
  Философия как феномен культуры. Понятие мировоззрения. Исторические типы мировоззрения Философия как наука. Предмет, объект и основные направления философии как науки Философия как феномен культуры. Философия (древнегреч...
8543. Философия древнего мира 22.65 KB
  Философия древнего мира Культурологические предпосылки возникновения философии. Философия Др.Индии и Китая Античные натуры философии Античные философии классического периода Философия периода эллинизма Предпосылки...
8544. Философия средних веков и эпохи Возрождения 21.52 KB
  Философия средних веков и эпохи Возрождения Основные принципы и проблемы средневековой философии. Философия периода патристики Философия периода схоластики Общая характеристика и основные проблемы философии эпохи Возрождения...
8545. Гносеология и этика И. Канта. 31.91 KB
  Гносеология и этика И. Канта. Родоначальником немецкой классической философии является Иммануил Кант. Основой своей философии он сделал гносеологию, в которой совершил переворот, аналогичный коперниканскому перевороту в астрономии. Впервые в филосо...
8546. Западная философия 20 века, важнейшие школы, идеи, представители 31.99 KB
  Западная философия 20 века, важнейшие школы, идеи, представители. Русская философия - одна из важнейших составных частей как отечественной, так и мировой культуры. В ней воплотились творческие поиски русского народа, проявились своеобразные черты на...
8547. Предмет и функции философии 33.56 KB
  Предмет и функции философии Жизнь с ее сложной паутиной коллизий, наука и культура в целом (куда входят все науки, виды искусства, религия и, разу-меется, философия) с их гигантскими достижениями требуют от нас, и прежде всего от молодежи, совершенс...
8548. Теория познания Ф. Бекона 40.71 KB
  Теория познания Ф. Бекона Родоначальником эмпиризма является английский мыслитель Фрэнсис Бэкон (1561-1626 гг.). Он выдвинул доктрину естественной философии, опирающейся на опытное познание, и преследовал цель способствовать человечеству с помощью...