Přejít na hlavní obsah
Naše technologie: silné typování obsahu v .NET (1. díl)

Naše technologie: silné typování obsahu v .NET (1. díl)

Chcete poznat technologie, se kterými v Kentico pracujeme? Přeložili jsme pro vás sérii článků, které se týkají jednoho z našich open source projektů. Bude řeč o silném typování obsahu získaného prostřednictvím Kentico Kontent Delivery .NET SDK. V tomto díle se podíváme na výhody a na generátor kódu. 

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? 

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č?

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.

Textstring
Rich textstring
Numberdecimal?
Multiple choiceIEnumerable<MultipleChoiceOption>
Date & timeDateTime?
AssetIEnumerable<Asset>
Modular contentIEnumerable<object>
TaxonomyIEnumerable<TaxonomyTerm>
URL slugstring

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!


Autorem článku je Jan Lenoch

Chcete si číst dál?

Velké srovnání prototypovacích nástrojů 2017

Náš UX designér Petr Augustin pro vás připravil přehled těch nejzajímavějších prototypovacích nástrojů, které právě letí.  Pokud máte projekt a potřebujete rychle ověřit nějakou vaši myšlenku, te…

V kategorii UX

Programátoři, testeři… a dál?

Programátor, nebo tester? Otázka, nad kterou pravděpodobně dumá mnoho čerstvých absolventů nebo studentů informatiky. Tomáš Nosek nechtěl ani jedno. Do Kentica nastoupil ještě při studiu na pozici Tec…

V kategoriích Rozhovory a Development

Aktivní rodičovství a co si pod tím představit

Občas není jednoduché sladit práci a péči o rodinu. Něco málo o tom víme :) Ale věříme, že jde dobře dělat oboje. Třeba proto, že u nás není problém si odběhnout z práce na hřiště, pracovat z domova n…

V kategorii Život v Kentico