Možná už znáte koncept tzv. headless CMS systémů a náš produkt Kentico Kontent.
Možná také víte, že weby a aplikace v .NET mohou využívat obsah z Kentico Kontent zasazený do tzv. silně typovaných modelů. Tedy že každá položka obsahu (content item) má svůj předem známý typ (např. "Článek", "Blogpost", "Produkt" atd.). Ukážu vám výhody a způsob použití silných typů z našeho Delivery .NET SDK. Na co se můžete těšit?
- Výhody, generátor typů (tento díl)
- Získávání silně typovaného obsahu
- Implementace dědičnosti
- Typování za běhu – proč (již brzy)
- Typování za běhu – použití (již brzy)
Proč vlastně silné typování
S obsahem uloženým v Kentico Kontent můžete v .NET aplikacích pracovat prostřednictvím Delivery .NET SDK. Ve své aplikaci jednoduše přidáte referenci na NuGet balíček našeho SDK a můžete začít využívat jeho metody pro přístup k obsahu. Nedávno jsme výrazně usnadnili práci s obsahem tím, že jsme implementovali silné typování a automatické typování za běhu.
V .NET je nanejvýš žádoucí mít informace zasazené do silných typů. Proč?
- Kód přesně ví, jaké vlastnosti má daný typ položek obsahu (content item) z Kentico Kontent. Tedy že např. blogpost má vždy svůj nadpis, úvod, titulní obrázek a datum publikace.
- Je možné používat generické kolekce.
- Většinu banálních chyb je možné odhalit během psaní kódu nebo při kompilaci.
- IntelliSense nabízí při psaní kódu vlastnosti a metody daného typu.
- A mnoho dalšího.
Největší radost vývojářům udělají i silné typy v ASP.NET MVC. Proč?
- Můžete rychle a spolehlivě vytvářet silně typované pohledy (views).
- Pohledy může generovat Visual Studio podle modelů pomocí tzv. scaffoldingu.
- Psaní spousty kódu si ušetříte díky DataAnnotations, display templates a HTML helperům.
- V ASP.NET Core MVC přichází ke slovu i tag helpery.
- Celý prezentační kód je možné spolehlivě testovat.
Donedávna v SDK každý typ obsahu (content type) z Kentico Kontent reprezentoval jen jediný typ – ContentItem. Teď už můžete mít pro každý svůj typ obsahu odpovídající CLR typ. Pojďme si tedy ukázat, jak CLR typy (Common Language Runtime types) vygenerovat a využít.
Generátor typů snadno a rychle
K čemu by bylo silné typování, kdybychom nutili vývojáře psát kód CLR typů ručně? K ničemu. Proto nechme práci strojům a generujme typy bleskově z příkazové řádky!
Náš generátor typů nemá podobu konzolové aplikace náhodou. Díky tomu se dá pustit i jako pre-build event Visual Studia nebo jako jeden z kroků v rámci celého procesu continuous integration/delivery.
Generátor je – stejně jako všechna naše SDK – open source projekt hostovaný v GitHubu. Stačí stáhnout .exe soubor a spustit:
CloudModelGenerator.exe --projectid "<projectid>" [--namespace "<custom-namespace>"] [--outputdir "<output-directory>"] [--withtypeprovider]
Toto je konkrétní příklad použití z naší ukázkové MVC aplikace:
CloudModelGenerator.exe --projectid "975bf280-fd91-488c-994c-2f04416e5ee3" --namespace "DancingGoat.Models" --outputdir "C:\Users\jan.lenoch\Source\Repos\cloud-sample-app-net\DancingGoat\Models\ContentTypes" --withtypeprovider
Příkaz vygeneroval následující výstup:
Utilita se na pozadí vždy připojí k veřejnému API endpointu pro typy obsahu, načte jejich názvy, kódové názvy, elementy, jejich typy atd. Pro každý typ vygeneruje soubor s třídou. Použití utility je jednoduché; nevyžaduje ani žádné přihlašování. Endpoint je totiž veřejně dostupný.
Jaké typy se generují
Následující tabulka obsahuje druhy elementů v našich typech obsahu a typy pro properties CLR typů vytvořených generátorem.
Text | string |
Rich text | string |
Number | decimal? |
Multiple choice | IEnumerable<MultipleChoiceOption> |
Date & time | DateTime? |
Asset | IEnumerable<Asset> |
Modular content | IEnumerable<object> |
Taxonomy | IEnumerable<TaxonomyTerm> |
URL slug | string |
Generátor vytváří všechny třídy jako partial. Pokud je rozšíříte pomocí nových, samostatných souborů, můžete bezstarostně přegenerovat původní soubory kdykoli znovu. Nepřijdete o žádné své úpravy.
Type provider
S volbou --withtypeprovider vyrobí generátor navíc ještě soubor CustomTypeProvider.cs, který propojí (namapuje) kódové názvy typů obsahu Kentico Kontent k vašim vygenerovaným CLR typům:
switch (contentType)
{
case "about_us":
return typeof(AboutUs);
case "accessory":
return typeof(Accessory);
// …
}
Proč? Díky tomu můžete tuto jednoduchou logiku nahradit svou vlastní.
Pokud například několik typů obsahu v Kentico Kontent má podobnou strukturu a v .NET aplikaci není potřeba mít pro jejich typy pokaždé svou vlastní třídu, je možné si ušetřit práci a sloučit vše do jedné třídy. Docílíte toho tak, že takto podobné typy obsahu pojmenujete vždy s přídomkem (např. "Aggregated") a všechny je přesměrujete do jednoho kódu:
if (contentType.StartsWith("Aggregated"))
{
return typeof(SomeAggregateType)
}
Možností při psaní vlastního type provideru je pochopitelně mnohem více.
Volba --withtypeprovider je nepovinná. Pokud ji nevyužijete a soubor CustomTypeProvider.cs nevygenerujete, Delivery .NET SDK bude automaticky párovat typy na základě jmenné konvence PascalCase. Soubor bude ale zapotřebí generovat, pokud budete chtít využívat jinou chytrou věc: automatické typování za běhu. O té si povíme ve čtvrtém dílu série.
Sečteno a podtrženo: žádná zbytečná práce
V tomto dílu jsme si ukázali, že silné typování otevírá vývojářům dveře ke všem radostem světa .NET. Generátor pak navíc umožňuje rychle (pře)generovat třídy pro typy obsahu.
Máte rádi .NET a open source?
Pokud ano, můžete si Delivery .NET SDK nejen vyzkoušet, ale třeba i přispět svými postřehy:
- Otázkou na fórech, nebo naopak odpovědí
- Krátkým wiki článkem na GitHubu
- Nahlášením chyby nebo její opravou prostřednictvím pull requestu
Možností máme mnoho. Pojďme spolu vytvářet nejlepší headless CMS v cloudu!
Autor
Zajímá vás, jak to u nás chodí, a chcete vědět všechno mezi prvními? Sledujte nás na Facebooku, LinkedIn nebo Instagramu.