Aplikace pro více zařízení (1.) – Portable libraries

Vítejte v miniseriálu, který se věnuje aplikacím pro více zařízení. Nadpis trochu zjednodušuje základní podstatu problému, což je “jak psát kód tak, aby byl co nejvíce znovupoužitelný v různých typech aplikací” (což by ale zase byl příliš dlouhý nadpis).

V temných dobách dávnověku…

… tedy až do roku 2012 Smile, nebylo vůbec jednoduché psát kód tak, aby běžel na více platformách. Pojďme si vyjmenovat ty, které jsou podporované Microsoftem:

  • .NET framework – desktop
  • .NET framework – serverová aplikace
  • Windows Phone
  • Windows 8 (Windows Store)
  • Silverlight
  • XBOX

S výjimkou prvních dvou možností přináší každá další platforma nový runtime, což znamená jiný typ DLL knihoven a nutnost oddělení projektů pro každou aplikaci z důvodu kompilace. Pokud chcete mít stejnou business logiku např. v aplikaci pro desktop a pro Windows Phone, je nutné založit dva oddělené projekty – pro každou platformu zvlášť. Tuto nepříjemnost lze částečně odstranit linkováním souborů mezi projekty, takže každý soubor na disku (a v repository zdrojového kódu) existuje pouze jednou, toto řešení je však náročné na disciplínu vývojářů, komplikuje změny v řešení a obzvláště u složitějších projektů je náročné ho udržet při životě.

… záchrana na obzoru

Visual Studio 2012 přináší koncept tzv. portable library (PL). Princip je velmi jednoduchý – máme jedinou knihovnu, jediné zdrojáky, jediný projekt ve Visual Studiu a tento projekt se pak referencuje z dalších projektů aplikací různých typů. Samozřejmě – každá platforma nabízí jinou sadu funkcí, takže PL může používat pouze funkce, které jsou společné všem implementovaným platformám (průnik tříd a jejich členů). Z toho důvodu je nutné při vytváření knihovny specifikovat podporované platformy:

image

IntelliSense nápověda pak vyfiltruje podmnožinu nabízených funkcí, stejně tak kompilátor nedovolí použít “nedovolené” funkce, které by nebyly k dispozici na všech platformách.

Ale pozor na omezení!

Dosud to znělo idylicky, ale věci nejsou tak jednoduché. Aby nebylo možné vytvořit závislosti na funkcích, které pak nebudou k dispozici, je omezeno, jaké knihovny se mohou vzájemně referencovat. Povolené kombinace jsou následující:

  • PL může referencovat pouze jinou PL, a to pouze tehdy, pokud referencovaná PL podporuje všechny platformy podporované referencující PL.
  • Platformově závislá knihovna může referencovat pouze platformově závislé knihovny ze stejné platformy anebo PL, které podporují její platformu.

Situaci si můžeme znázornit též obrázkem:

image

Všechny ostatní reference nejsou povolené a nepodaří se vám buď ani vytvořit referenci anebo výslednou aplikaci nezkompilujete.

Na první pohled to vypadá nevinně, ale je to poměrně přísné omezení. Každá platforma má jinak implementované běžné funkce, například HTTP komunikaci anebo služby lokálního úložiště, takže je nutné je abstrahovat do platformově nezávislého rozhraní (definovaného v PL) a platformově závislých tříd (implementovaných v platformově závislých knihovnách).

Vzorové řešení

Během celého miniseriálu budu pro ukázky používat jednoduchou, ale zcela funkční aplikaci, jejíž kód dám později k dispozici ke stažení. Půjde o nákupní seznam využívající Azure Mobile Services pro autentizaci uživatelů a uložení dat - položek nákupního košíku.

Struktura celého řešení je poměrně jednoduchá - jeden projekt pro Windows Phone klienta, jeden pro Windows 8 (Windows Store) klienta a jedna společná knihovna ve formě Portable Library pro využití z obou klientů:

Pozvánka

Dne 9.4. od 10:00 hodin pořádáme na výše uvedené téma hodinový online seminář, kde se o problematice můžete dozvědět více. Využijte příležitosti položit konkrétní dotazy, které vás zajímají. Zaregistrovat se můžete zde.

V dalších dílech nás čeká návrhový vzor MVVM, jazyk XAML a výše zmíněné možnosti abstrakce platformy.

Michael