1 Nowoczesna architektura w aplikacjach Windows StoreWojciech Poniatowski
2 Wojciech Poniatowski Head of Windows Developer @ iApps TechnologiesMVP MCT, MCPD Śląska Regionalna Grupa Microsoft Prelegent Autor webcastów
3 O co chodzi? Narzędzia Frameworki Abstrakcja WzorceMVVM IOC/DI Cechy charakterystyczne aplikacji Windows 8 Testy jednostkowe
4 Co chemy osiągnąć? Separacja Testowalność Abstrakcja Klocki LEGOStabilność Wspólny kod Windows 8, Windows Phone 8 Może nawet WPF oraz Silverlight
5 Narzędzia Visual Studio 2012 JetBrains R# JetBrains dotCovernCrunch jest “prawie” gotowy na WinRT
6 Frameworki WinRT Callisto MVVM Light MetroIOC xUnit
7 Przydatne wzorce projektoweSingleton Repository Messenger Factory DI/IOC MVVM Locator
8 Foo : IFoo Każda klasa implementuje interface AboutView : IAboutViewMainViewModel : IMainViewModel MyRepository : IMyRepository DialogService : IDialogService Itd…
9 IoC/DI oraz InstanceFactoryKażdy interface i class są zajerestrowane (zamapowane) w InstanceFactory InstanceFactory Wrapper dla IoC (MetroIOC) Fabryka obiektów
10 MVVM Idealny dla XAML’a Binding Commanding MessagingPodstawowa implementacja jest prosta Za mało abstrakcji
11 MVVM Commanding Brak kodu w code-behind WinRT jest ograniczonePrzyciski – Command (Click) TextBlock – Tapped ( ? ) Potrzebna proteza EventToCommand
12 EventToCommand Nuget WinRtBehaviors Win8nl
13 Messenger Messenger aka Mediator aka Pub/Sub aka EventAggregatorViewModel’e niezależne od siebie Brak wzajemnych referencji (nawet po interface) Komunikacja VM poprzez Messenger’a “Mam takie dane, niech zainteresowany je sobie odbierze”
14 Locator Własna klasa Rejestruje (mapuje) interface i klasyUdostępnia właściwości ze wszystkimi ViewModel’ami Przydaje się dla silnie typowanych wyrażeń Binding w XAM
15 A co z cechami Windows 8?
16 Okna dialogowe DialogWindow Element UI (View)Sterowany przez ViewModel DialogService : IDialogService Własna klasa (wrapper/Serwis) zarejestrowana w IoC
17 Nawigacja Wbudowana w WinRT Jak nawigować z poziomu MVVM?Trzeba się odciąć Utworzyć osobny Serwis Sterowanie z poziomu ViewModel To ViewModel decyduje o przepływie aplikacji NavigationService : INavigationService Własna klasa (wrapper) zarejestrowana w IoC
18 Charms / Settings Opcje aplikacji Globalne Per widok AboutPolityka prywatności Zbudować wartwę abst Globalne Per widok
19 Charms / Schare Przekazywanie danych między 2 aplikacjamiInicjalizowane z ViewModel Nie używam DataTransferManager w ViewModel Potrzebna separacja (abstrakcja) ScharingService : IScharingService Klasa (wapper) zarejestrowany w IoC
20 SemanticZoom ISemanticZoom ZoomIn ZoomOut ListView GridViewNie ma sprawy Zwykły Binding ZoomOut Potrzebny ekstra code-behind
21 Testy jednostkowe Są ważne Nie są łatwe Mogą być łatweZła architektura Legacy code Mogą być łatwe Dobra architektura Mock, Fake
22 Podsumowanie Interface do każdej klasyRozdzielenie aplikacji na warstwy View ViewModel Model (Repository) Wszystko jest sklejone poprzez InstanceFactory oraz IoC/DI Łatwość wymiany “klocków” Różne implementacje tych samych interface’ów Testowalność
23 Q & A
24 Dziękuję za uwagę