Приложения дляWindows PhoneКак мы это делаемГригорий Никонов,Actis® Wunderman.
Обо мнеНа данный момент руковожу разработкой мобильныхприложений агентства Actis Wunderman, в котором тружусь смомента поя...
Наши работыМы занимаемся разработкой приложений для ведущихплатформ около трех лет. Вот, что мы сделали для WindowsPhone:•...
Наши работы: КиноПоиск
Наши работы: Concert.ru
Наши работы: ЛитРес
Мы – ленивыеИ поэтому создали несколько инструментов, которыепозволяют нам экономить время и усилия:•Фреймворк работы с су...
ДанныеСценарии использования источников данных в мобильныхприложениях, в порядке уменьшения частоты использования:•Получит...
ДанныеДанные можно разделить на две категории – сущности иколлекции сущностейИ сущности и коллекции сущностей бываютиденти...
СущностиСобытия изменения свойств:   ObservableObjectОбновление и клонирование:   XObject, XObject<T>Ключи для идентификац...
КоллекцииИнтеллектуальное обновление:   XCollection<T>Применение фильтров:   XFilteredCollection<T>Объединение и разделени...
КэшированиеЗапросы как идентификация коллекций:   XQuery<T>Применение фильтров:   XFilteredCollection<T>Собственно кэш:   ...
Пример: Свойстваclass Person : XObject{    string _name;    XCollection<Person> _children;    public string Name    {     ...
Пример: ProcessCopyclass Person : XObject{    protected override void ProcessCopy(        XObject source, bool cloning, bo...
Пример: КлонированиеPerson person = new Person{    Name = “John”,    Children = new XCollection<Person>        {          ...
Пример: ОбновлениеPerson person1 = new Person { Name = “John” }Person person2 = new Person { Name = “Mary” }person1.Update...
Пример: КоллекцииXCollection<Person> l1 = new XCollection<Person>() { … };XCollection<Person> l2 = new XCollection<Person>...
Пример: Хитрые коллекцииXCollection<Person> studentsOfClassA = …;XCollection<Person> studentsOfClassB = …;var firstThreeSt...
Генератор сущностейПоддержка XML/JSON сериализации
ДемонстрацияСгенерированные классы, содержащие ключевые элементы,необходимые для эффективной работы с данными:•Правильное ...
Модели представленийПредназначены для получения и преобразования данных,необходимых представлениям, а также для выполнения...
СессииВсё «управляемое» общение модели (модели представления)с внешним миром происходит в рамках сессииСессия содержит пар...
Работа с сессиейСозданиеvar session = CreateSession()    .AddParameter( “userName”, “John” )    .AddParameter( “age”, 48 )...
Откуда она знает, что делать?Виртуальные методы   ShouldLoadSession   LoadSessionЧасти   RegisterPart      string part,   ...
Типичная модельКонструктор   Получает сервисы через DI   Регистрирует части   Создает командыМетоды обработки частей   Про...
Модель сущностиИспользует расширенную сессию, которая включает в себяключ, идентифицирующий объект: EntitySessionРегистрир...
Типичная модель сущностиКонструктор   Получает сервисы   Создает командыМетод LoadEntity   Загружает данные из внешнего ис...
INavigationServiceОдин из самых важных сервисов, доступных моделямОпределяет независимый от платформы способ навигациимежд...
Другие сервисыIDataExchangeService   Информирование об обмене даннымиIViewModelExceptionHandlingServiceIExceptionHandlingS...
ПредставленияPhoneApplication – наследник Application   Регистрация сервисов   Обработка ошибок уровня приложения
PageУправление жизненным циклом   OnPageCreated, OnPageDestroyed,   OnPageAsleep, OnPageAwaken, OnPageResurrectedДоступ к ...
ViewModelPage<TViewModel>Страница с созданной модельюНачальная загрузка данных   CreateDataSession, CreateDataSessionAsync...
EntityPageАвтоматически выбирает ключ из параметров и создаетсессию для загрузки сущности.
Но это еще не всё!Генератор классов-заглушек и частичных классов-представлений:<View Name=“MainView”/><View Name=“FeedChan...
Но и это еще не всё!Декораторы страниц используются для выполненияоднообразных действий со страницами, например для показа...
Вопросы?Григорий Никонов,Actis® Wundermangregoryn@actis.ru(495) 234-0009http://www.actis.ru/
Upcoming SlideShare
Loading in …5
×

CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone – используемые инструменты и компоненты

771 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
771
On SlideShare
0
From Embeds
0
Number of Embeds
91
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Показываем проект в VisualStudio
  • Показываем проект в VisualStudio – модель, которая подгружает список фидов
  • Показываем ChannelItemViewModel
  • Навигацию рассмотрим, когда будем говорить о видах
  • Навигацию рассмотрим, когда будем говорить о видах
  • CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone – используемые инструменты и компоненты

    1. 1. Приложения дляWindows PhoneКак мы это делаемГригорий Никонов,Actis® Wunderman.
    2. 2. Обо мнеНа данный момент руковожу разработкой мобильныхприложений агентства Actis Wunderman, в котором тружусь смомента появления на свет агентства Actis, позжеприсоединившегося к сети Wunderman.Ранее занимался разработкой, созданием и внедрениеминтернет-проектов.
    3. 3. Наши работыМы занимаемся разработкой приложений для ведущихплатформ около трех лет. Вот, что мы сделали для WindowsPhone:•КиноПоиск•Concert.ru•ЛитРесНесколько неназываемых проектов скоро должны бытьопубликованы, тогда мы их назовём.
    4. 4. Наши работы: КиноПоиск
    5. 5. Наши работы: Concert.ru
    6. 6. Наши работы: ЛитРес
    7. 7. Мы – ленивыеИ поэтому создали несколько инструментов, которыепозволяют нам экономить время и усилия:•Фреймворк работы с сущностями и коллекциями•Фреймворк моделей представлений•Фреймворк представлений для Windows Phone и другихплатформ•T4-генераторы кодаКроме того, сервер непрерывной интеграции и тестыпозволяют нам не заботиться о проблемах внесенияизменений в код и координировать совместную работу
    8. 8. ДанныеСценарии использования источников данных в мобильныхприложениях, в порядке уменьшения частоты использования:•Получить коллекцию заголовков данных•Получить конкретную сущность•Выполнить единичное действие с источником данных•Отправить изменённую сущность«Мобильность» платформы накладывает некоторыеограничения на возможность и целесообразность передачибольших объёмов данных
    9. 9. ДанныеДанные можно разделить на две категории – сущности иколлекции сущностейИ сущности и коллекции сущностей бываютидентифицируемые и неидентифицируемые
    10. 10. СущностиСобытия изменения свойств: ObservableObjectОбновление и клонирование: XObject, XObject<T>Ключи для идентификации объектов: XKey
    11. 11. КоллекцииИнтеллектуальное обновление: XCollection<T>Применение фильтров: XFilteredCollection<T>Объединение и разделение: XCombinedCollection<T>, XSubRangeCollection<T>
    12. 12. КэшированиеЗапросы как идентификация коллекций: XQuery<T>Применение фильтров: XFilteredCollection<T>Собственно кэш: XCache<T>
    13. 13. Пример: Свойстваclass Person : XObject{ string _name; XCollection<Person> _children; public string Name { get { return _name; } set { SetProperty( ref _name, value, “Name” ); } } public XCollection<Person> Children { get { return _children; } set { SetProperty( ref _name, value, “Children” ); } }}
    14. 14. Пример: ProcessCopyclass Person : XObject{ protected override void ProcessCopy( XObject source, bool cloning, bool deepCloning ) { base.ProcessCopy( source, cloning, deepCloning ); Person other = (Person) source; _name = other._name; ProcessCopyProperty( ref _children, other._children, cloning, deepCloning ); }}
    15. 15. Пример: КлонированиеPerson person = new Person{ Name = “John”, Children = new XCollection<Person> { new Person { Name = “Bob” } }};Person softClone = (Person) person.Clone( false );Person deepClone = (Person) person.Clone( true );person.Children[0].Name = “Mary”;softClone.Children[0].Name // “Mary”deepClone.Children[0].Name // “Bob”
    16. 16. Пример: ОбновлениеPerson person1 = new Person { Name = “John” }Person person2 = new Person { Name = “Mary” }person1.Update( person2 );person1.Name // “Mary”XCollection<Person> l1 = new XCollection<Person>() { … };XCollection<Person> l2 = new XCollection<Person>() { … };var result = l1.Update( l2 );
    17. 17. Пример: КоллекцииXCollection<Person> l1 = new XCollection<Person>() { … };XCollection<Person> l2 = new XCollection<Person>() { … };var softClone = l1.Clone( false );var deepClone = l1.Clone( true );var result = l1.Update( l2 );
    18. 18. Пример: Хитрые коллекцииXCollection<Person> studentsOfClassA = …;XCollection<Person> studentsOfClassB = …;var firstThreeStudentsOfClassA = new XSubRangeCollection( studentsOfClassA, 0, 3 );var firstTwoStudentsOfClassB = new XSubRangeCollection( studentsOfClassB, 0, 2 );var topStudents = new XCombinedCollection( firstThreeStudentsOfClassA, firstTwoStudentsOfClassB );
    19. 19. Генератор сущностейПоддержка XML/JSON сериализации
    20. 20. ДемонстрацияСгенерированные классы, содержащие ключевые элементы,необходимые для эффективной работы с данными:•Правильное обновление данных•Правильное клонирование данных•Выборка с помощью ключей в коллекциях и кэше
    21. 21. Модели представленийПредназначены для получения и преобразования данных,необходимых представлениям, а также для выполнениядругих действий над этими данными.Наиболее частые операции в мобильных приложениях –загрузка данных (списки или отдельные сущности) дляпредставления их пользователю.Работа с источниками данных должна быть асинхронной –нельзя блокировать поток пользовательского интерфейса.Необходимо учитывать возможность досрочного прекращениявыполняемых операций – по разным причинам.
    22. 22. СессииВсё «управляемое» общение модели (модели представления)с внешним миром происходит в рамках сессииСессия содержит параметры, необходимые для доступа кданнымСессия содержит жетон, используемый для прекращенияасинхронных задач (CancellationToken)Обработкой сессии занимается модель
    23. 23. Работа с сессиейСозданиеvar session = CreateSession() .AddParameter( “userName”, “John” ) .AddParameter( “age”, 48 );Доступ к параметрамvar userName = session.Parameters.Get<string>( “userName” );var age = session.Parameters.Get<int>( “age” );var sex = session.Parameters.Get<string>( “sex”, “male” );Обработкаawait viewModel.Load( session );
    24. 24. Откуда она знает, что делать?Виртуальные методы ShouldLoadSession LoadSessionЧасти RegisterPart string part, Func<Session, Task> processor, Func<Session, bool> checker, bool loadIfNoPartsSpecified
    25. 25. Типичная модельКонструктор Получает сервисы через DI Регистрирует части Создает командыМетоды обработки частей Проверяют необходимость обработки сессии Осуществляют доступ/обновление данных
    26. 26. Модель сущностиИспользует расширенную сессию, которая включает в себяключ, идентифицирующий объект: EntitySessionРегистрирует методы для части, связанной с обработкойсущности: ShouldLoadEntity и LoadEntity.Объявляет свойство Entity
    27. 27. Типичная модель сущностиКонструктор Получает сервисы Создает командыМетод LoadEntity Загружает данные из внешнего источника или из кэша Присваивает значение свойству Entity
    28. 28. INavigationServiceОдин из самых важных сервисов, доступных моделямОпределяет независимый от платформы способ навигациимежду видамиns.Navigate( “PersonView”, Parameters.Create( “Id”, 1 ) );Позволяет создавать и использовать команды навигации:ViewDetails = new NavigationCommand( ns, “DetailedView” );PersonSelected = new NavigationCommand<Person>( ns, “PersonView”, person => person.KeyParameter() );
    29. 29. Другие сервисыIDataExchangeService Информирование об обмене даннымиIViewModelExceptionHandlingServiceIExceptionHandlingService Унифицированная обработка исключений
    30. 30. ПредставленияPhoneApplication – наследник Application Регистрация сервисов Обработка ошибок уровня приложения
    31. 31. PageУправление жизненным циклом OnPageCreated, OnPageDestroyed, OnPageAsleep, OnPageAwaken, OnPageResurrectedДоступ к параметрам ViewParametersКонтекст для связывания данных CreateDataContextАтрибутирование для навигации [View( “UserView” )] [ViewParameter( “userName”, typeof( string ) )]
    32. 32. ViewModelPage<TViewModel>Страница с созданной модельюНачальная загрузка данных CreateDataSession, CreateDataSessionAsync OnDataLoadComplete, OnDataLoadFailedОбработка нештатных ситуаций (FAS)Управление областью жизни моделиСвязывание данных в XAML <TextBlock Text=“{Binding ViewModel.Title}”/>
    33. 33. EntityPageАвтоматически выбирает ключ из параметров и создаетсессию для загрузки сущности.
    34. 34. Но это еще не всё!Генератор классов-заглушек и частичных классов-представлений:<View Name=“MainView”/><View Name=“FeedChannelView” Entity=“FeedChannel”/>Во многих случаях файл View.xaml.cs не нужен, всё делаетсяавтомагическиГенератор константных имен представлений и параметров, атакже методов для создания параметров навигации
    35. 35. Но и это еще не всё!Декораторы страниц используются для выполненияоднообразных действий со страницами, например для показасообщений об ошибках, исчезновении сетевого подключения ит.п.Встроенный механизм обработки страниц, для которых нужнааутентификация – параметр RequiresAuthenticationатрибута [View()]
    36. 36. Вопросы?Григорий Никонов,Actis® Wundermangregoryn@actis.ru(495) 234-0009http://www.actis.ru/

    ×