Promo akce

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

  • Comments 11

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

  • .NET framework – serverová aplikace má být jako ASP.NET webová aplikace?

  • Nemel jsem na mysli nic konkretniho, zkratka cokoliv beziciho na serveru a napsaneho v .NETu - ASP.NET aplikace je jiste dobry priklad.

  • Cokoliv běžícího na serveru může ale klidně být desktopová aplikace, takže by bylo dobré dodržovat odpovídající terminologii.

  • Windows Phone 7 a Windows Phone 8 bych bral také jako dvě rozdílné platformy :)

  • Legrace je, že některé platformy umí awaitovat a některé ne. Neshodnou se ani na HTTP stacku. Ve výsledku se PL nedá použít v takovém rozsahu, v jakém bych jí použít chtěl.

  • HTTP stack je platformově závislý a není moc těžké ho abstrahovat. Budu se tomu věnovat v posledním čtvrtém díle.

    Ale máte pravdu, portable libraries je málo, ale situace se lepší (např. teď je k dispozici Alfa verze knihovny pro Azure Mobile Services jako portable library + extenze pro konkrétní platformu).

  • Proč se na akci není možné zaregostrovat pomocí Live ID, ale nabízí se pouze možnost "Chci se zaregistrovat bez přihlášení." a je potřeba vyplnit registrační údaje?

  • Boris> Dobrý den, registrace byla upravena a nyní je možno se registrovat jak s LiveID, tak bez přihlášení, díky za feedback!

  • > Vaclav: async/await je pri pouzivani VS 2012 k dispozici pro všechny platformy pomoci Async Targetting Pack:

    nuget.org/.../1.0.14-rc

  • Chtěl jsem vytvářet aplikaci postavenou na PCL pro Windows Store a Windows Phone 8, ale skončil jsem na tom, že jsem nemohl používat knihovnu Windows.Storage, ačkoliv obě platformy by jsi měli obsahovat!

  • Funkce typu Storage jdou snadno abstrahovat. Pockejte na ctvrty dil serialu.

Page 1 of 1 (11 items)
Leave a Comment
  • Please add 2 and 2 and type the answer here:
  • Post