Nowoczesna architektura w aplikacjach Windows Store Wojciech Poniatowski
Wojciech Poniatowski Head of Windows Developer @ iApps Technologies MVP MCT, MCPD Śląska Regionalna Grupa Microsoft Prelegent Autor webcastów
O co chodzi? Narzędzia Frameworki Abstrakcja Wzorce MVVM IOC/DI Cechy charakterystyczne aplikacji Windows 8 Testy jednostkowe
Co chemy osiągnąć? Separacja Testowalność Abstrakcja Klocki LEGO Stabilność Wspólny kod Windows 8, Windows Phone 8 Może nawet WPF oraz Silverlight
Narzędzia Visual Studio 2012 JetBrains R# JetBrains dotCover nCrunch jest “prawie” gotowy na WinRT
Frameworki WinRT Callisto MVVM Light MetroIOC xUnit
Przydatne wzorce projektowe Singleton Repository Messenger Factory DI/IOC MVVM Locator
Foo : IFoo Każda klasa implementuje interface AboutView : IAboutView MainViewModel : IMainViewModel MyRepository : IMyRepository DialogService : IDialogService Itd…
IoC/DI oraz InstanceFactory Każdy interface i class są zajerestrowane (zamapowane) w InstanceFactory InstanceFactory Wrapper dla IoC (MetroIOC) Fabryka obiektów
MVVM Idealny dla XAML’a Binding Commanding Messaging Podstawowa implementacja jest prosta Za mało abstrakcji
MVVM Commanding Brak kodu w code-behind WinRT jest ograniczone Przyciski – Command (Click) TextBlock – Tapped ( ? ) Potrzebna proteza EventToCommand
EventToCommand Nuget WinRtBehaviors Win8nl <TextBlock Text="{Binding Title}" FontSize="48"> <WinRtBehaviors:Interaction.Behaviors> <Win8nl_Behavior:EventToBoundCommandBehavior Command="{Binding NavigateToDetailsCommand}" CommandParameter="{Binding Title}" Event="Tapped" /> </WinRtBehaviors:Interaction.Behaviors> </TextBlock>
Messenger Messenger aka Mediator aka Pub/Sub aka EventAggregator ViewModel’e niezależne od siebie Brak wzajemnych referencji (nawet po interface) Komunikacja VM poprzez Messenger’a “Mam takie dane, niech zainteresowany je sobie odbierze”
Locator Własna klasa Rejestruje (mapuje) interface i klasy Udostępnia właściwości ze wszystkimi ViewModel’ami Przydaje się dla silnie typowanych wyrażeń Binding w XAM
A co z cechami Windows 8?
Okna dialogowe DialogWindow Element UI (View) Sterowany przez ViewModel DialogService : IDialogService Własna klasa (wrapper/Serwis) zarejestrowana w IoC
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
Charms / Settings Opcje aplikacji Globalne Per widok About Polityka prywatności Zbudować wartwę abst Globalne Per widok
Charms / Schare Przekazywanie danych między 2 aplikacjami Inicjalizowane z ViewModel Nie używam DataTransferManager w ViewModel Potrzebna separacja (abstrakcja) ScharingService : IScharingService Klasa (wapper) zarejestrowany w IoC
SemanticZoom ISemanticZoom ZoomIn ZoomOut ListView GridView Nie ma sprawy Zwykły Binding ZoomOut Potrzebny ekstra code-behind
Testy jednostkowe Są ważne Nie są łatwe Mogą być łatwe Zła architektura Legacy code Mogą być łatwe Dobra architektura Mock, Fake
Podsumowanie Interface do każdej klasy Rozdzielenie 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ść
Q & A
Dziękuję za uwagę