CineStar Černý Most Praha
31. 10. 2012
Stejná aplikace na více zařízeních Michael Juřek Microsoft s.r.o.
Potřebné ingredience 1. Portable libraries 2. Návrhový vzor MVVM 3. XAML 4. Abstrakce platformy
Použití kódu ve více aplikacích Stejný kód je často žádoucí využít na více platformách: .NET framework – desktop .NET framework – serverová aplikace Windows Phone Windows 8 (Windows Store) Silverlight XBOX VS do verze 2010 nenabízel dobrou podporu Možnost linkování souborů do projektu – křehké, nepříliš praktické
VS 2012 – portable library (PL) DLL knihovna pro více platforem Jeden projekt, jeden zdrojový kód, jeden kompilační výstup Každá platforma obsahuje různou sadu technologií PL mohou obsahovat pouze společný průnik technologií vybraných podporovaných platforem Mohou referencovat pouze jiné PL, které podporují stejné platformy
Možné reference Knihovna 3 (platforma A)
Knihovna 4 (platforma A)
Knihovna 1 (PL) (podpora A)
Knihovna 2 (PL) (podpora A, B)
Knihovna 5 (platforma B)
Knihovna 6 (platforma B)
Všechny ostatní reference nejsou povoleny
Ukázka: Úkolovník
Reference
Reference
DEMO Založení projektů
Potřebné ingredience 1. Portable libraries 2. Návrhový vzor MVVM 3. XAML 4. Abstrakce platformy
Co je MVVM? Model-View-ViewModel Návrhový vzor z rodiny MV* (MVC, MVP, ...) Čistě odděluje jednotlivé vrstvy aplikace (dobře udržovatelný): Vzhled UI (View) – „vizualizace stavu UI“ Stav a chování UI (ViewModel) Nižší vrstvy (Model) – např. přístup k datům, volání back-endu, herní algoritmus, ... Nabízí velmi dobrou testovatelnost: ViewModel je plně testovatelný bez uživatelského rozhraní View neobsahuje prakticky žádný kód k testování
Schéma MVVM View Jak zobrazit? Interakce s uživatelem
Specifická platforma Data binding
ViewModel Co zobrazit? Řízení interakce Model Datové objekty Obchodní logika atd.
Reference
Portable library
ViewModel Nejdůležitější součást návrhového vzoru Připravuje a zpřístupňuje své vlastnosti pro data binding Je to jeho primární úloha Nemá žádnou znalost View Je velmi dobře testovatelný Nezávisí na žádném vizuálním prvku Je samostatně instancovatelný Může být (a bývá) umístěno v oddělené knihovně od View
ViewModel – prakticky Obaluje jeden nebo více objektů z nižších vrstev Implementuje INotifyPropertyChanged pro zpřístupněné vlastnosti Zpřístupněné objekty samy implementují INotifyPropertyChanged Zpřístupněné kolekce implementují INotifyCollectionChanged pro změny obsahu Nejjednodušší je použít ObservableCollection
Operace na datech se provádí prostřednictvím příkazů zpřístupňujících ICommand Definují vlastní akci a kdy je možné ji provést Může též zpřístupňovat události, které pak slouží k navigaci v UI
Ukázka: Úkolovník
Reference
Reference
DEMO Model a ViewModel
Potřebné ingredience 1. Portable libraries 2. Návrhový vzor MVVM 3. XAML 4. Abstrakce platformy
XAML je všude Moderní deklarativní popis uživatelského rozhraní Propracovaný a jednoduchý data binding XAML je na všech typech zařízení a aplikací WPF na desktopu Windows 8 dotykové aplikace Windows Phone (Silverlight v prohlížeči) ??? XBOX ???
Stejný XAML všude? Bohužel NE: Různé formáty zařízení, styly práce a navigace Různé sady standardních ovládacích prvků Různá sada schopností implementace Na druhou stranu ovšem: Používáte stejné postupy a znalosti Velké části kódu lze přenášet kopírováním
XAML = View Prakticky vše by měl řešit data binding na ViewModel ViewModel je přiřazený jako DataContext Věnujte pozornost atributům: Mode, Converter, UpdateSourceTrigger, ... (ne všechny na všech platformách) V ideálním případě neobsahuje žádný code-behind Ale není to priorita, buďte pragmatičtí Naučte se používat třídy implementující IValueConverter Např. datum splatnosti -> barva
Ukázka: Úkolovník
Reference
Reference
DEMO XAML pro View
Potřebné ingredience 1. Portable libraries 2. Návrhový vzor MVVM 3. XAML 4. Abstrakce platformy
Abstrakce platformy Typická aplikace potřebuje využívat řadu systémových služeb: Kryptografie, síťová komunikace, uložení nastavení, notifikace, autentizace, ... Implementace těchto funkcí je na různých platformách různá Různé mechanismy, třídy, signatury metod, knihovny Řešením je abstrakce platformy
Princip Ve sdíleném kódu se definují rozhraní/abstraktní třídy pro jednotlivé systémové služby Sdílený kód je závislý na těchto definicích Každá platforma definuje svoje konkrétní implementace těchto rozhraní/abstraktních tříd Při startu aplikace jsou konkrétní implementace předány sdílenému kódu, který je pak volá
Příklad realizace Sdílený kód: Definice rozhraní IStorage, INotification Statická třída Platform obsahující: vlastnost Storage typu IStorage vlastnost Notification typu INotification Kód používá služby platformy (např. Platform.Storage.Save(...)) Kód každé platformy: Implementuje konkrétní třídy Storage, Notification Při startu jejich instance přiřadí vlastnostem třídy Platform
Ukázka: Úkolovník
Reference
Reference
DEMO Abstrakce platformy
Závěrem Aplikaci lze napsat pro více platforem tak, aby většina kódu byla sdílená napříč platformami Potřebné ingredience: Portable libraries Návrhový vzor MVVM XAML Abstrakce platformy