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

Naše technologie: silné typování obsahu v .NET (2. 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 Cloud Delivery .NET SDK. V druhém díle si ukážeme, jak získávat silně typovaný obsah.

Možná už znáte koncept tzv. headless CMS systémů a náš produkt Kentico Cloud
Možná také víte, že weby a aplikace v .NET mohou využívat obsah z Kentico Cloud zasazený do tzv. silně typovaných modelů. Ukážeme vám výhody a způsob použití silných typů z našeho Delivery .NET SDK

Obsah seriálu:

Získávání silně typovaného obsahu dříve a nyní

Položky obsahu (content items) z Kentico Cloud můžete získávat buď jakožto CLR objekty typu ContentItem, nebo o mnoho lépe jako speciální CLR objekty typované přesně podle toho, jaké elementy mají vaše typy obsahu (content types) v Kentico Cloud.

MINULOST

Dříve bylo možné získat obsah takto:

var response = await deliveryClient.GetItemAsync("on_roasts");

Položky obsahu získané takovým kódem měly vždy podobu objektu typu ContentItem s pouze dvěma properties:

  • dynamic Elements
  • ContentItemSystemAttributes System

SOUČASNOST

Naproti tomu, teď už můžete zavolat generický overload metody GetItemAsync se specifikovaným vlastním typem:

var response = await deliveryClient.GetItemAsync<Article>("on_roasts");

Vrátí se vám objekt typu Article se všemi properties,
které má typ obsahu Article v Kentico Cloud jako své elementy:

  • IEnumerable<TaxonomyTerm> Personas
  • string Title
  • IEnumerable<Asset> TeaserImage
  • DateTime? PostDate
  • string Summary
  • string BodyCopy
  • IEnumerable<object> RelatedArticles
  • string MetaKeywords
  • string MetaDescription
  • string UrlPattern
  • ContentItemSystemAttributes System

To už vypadá lépe, že? 

Výhoda spočívá v tom, že už nemusíte provádět cast přes proprietární helper metody:

var bodyCopy = response.Item.GetString("summary");
var postDate = response.Item.GetDate("post_date");

Teď už má každý element předem známou podobu.

Pokud jste si všimli property RelatedArticles a ptáte se, proč má tak obecně definovaný typ IEnumerable<object>, pak vězte, že objekty v kolekci budou mít za běhu ve skutečnosti typ Article. Jak jsme toho docílili, se dočtete v pátém díle této série.

DataAnnotations slouží k přesnějšímu odlišení typů

Může to znít překvapivě, ale rozlišit skutečnou povahu elementů pomocí CLR typů nemusí být vždy ta nejlepší cesta. 

Příklad první:  telefonní číslo bývá vhodné uložit i se speciálními znaky pro odlišení předvolby, klapky atp. Proto se často ukládá do textového elementu (namísto číselného). 

Příklad druhý:  údaj o e-mailové adrese je zpravidla nejvhodnější mít jednoduchý textový element, nikoliv hluboce strukturovaný objekt. Pokud pro tyto údaje zvolíte textové elementy, generátor (viz minulý díl) pro ně vytvoří properties typu string. 

Jak tedy rychle odlišit oba stringy, aby aplikace věděla, že je má například vykreslit s klikatelným odkazem? Pomocí DataAnnotations atributů. Uvedené příklady s telefonním číslem a e-mailem (a jiné) máme implementovány v naší ukázkové MVC aplikaci takto:

[DataType(DataType.PhoneNumber)]
public string Phone { get; set; }

[EmailAddress]
public string Email { get; set; }

[DataType(DataType.Html)]
public string LongDescription { get; set; }

Tím, že properties opatříte potřebnými atributy, dáte knihovnám v .NET frameworku signál, jaký přesný typ dané properties mají. DataAnnotations atributy znají například ASP.NET MVC, WinForms, mnoho tříd v samotném .NET frameworku a .NET Core. Dokonce i některé aplikace vyvíjené třetími stranami umožňují při psaní pluginů využívat DataAnnotations.

Partial třídy pomáhájí zachovat atributy při generování

Opatřit properties atributy je dobrá věc; jenže jak si zachováte vaše atributy i poté, co si přegenerujete CLR typy po úpravách v Kentico Coud? Pomocí partial tříd. A jak docílit toho, že property se bude nacházet v generovaném souboru a její atribut v jiném souboru? Řečením je MetadataTypeAttribute atribut. Jednoduše vytvoříte nový soubor partial třídy a přidáte do něj doprovodnou třídu s atributy. Na doprovodnou třídu bude odkazovat MetadataTypeAttribute atribut. Například takto:

using System.ComponentModel.DataAnnotations;

namespace DancingGoat.Models
{
    [MetadataType(typeof(CoffeeMetadata))]
    public partial class Coffee
    {
    }

    public class CoffeeMetadata
    {
        [DataType(DataType.Html)]
        public string ShortDescription { get; set; }

        [DataType(DataType.Html)]
        public string LongDescription { get; set; }
    }
}

Co si odnést z dnešního dílu?

V tomto dílu jste se dozvěděli, jak získat pomocí Delivery .NET SDK položky obsahu v podobě CLR typů odpovídajích vašim typům obsahu. Navíc jsme si ukázali, jak docílit ještě přesnějšího a zároveň jednoduchého odlišení typů pomocí DataAnnotations. To vše s možností přegenerovat typy kdykoli – bez ztráty už napsaných atributů. 

Tímto postupem můžete nechat např. ASP.NET MVC, aby elementy pro e-mailovou adresu vždy automaticky vykreslilo jako klikatelné odkazy. V příštím díle si ukážeme, jak implementovat dědičnost mezi typy. A ještě zdaleka nejsme u konce. V dalších dílech se dozvíte, proč obyčejné silné typování někdy nestačí a jak jsme se s problémem vypořádali.

Povíte nám, co vás zajímá a o čem dalším psát?

Napište nám na fórech nebo třeba formou issue v GitHubu. Pokud nám chcete dát připomínku k produktům nebo ovlivnit vývoj open source projektů svým howto článkem nebo vlastním kódem, nezůstane to bez odezvy. 

Pojďme společně vytvářet nejlepší headless CMS v cloudu!

Autorem článku je Jan Lenoch

Chcete si číst dál?

HR? Nejsme žádné čarodějnice!

HR. Oddělení, o kterém se ve firmě nemluví. Nebo mluví až moc. Obor, který je opředen mnoha historkami. A jak to vidíme my? Řekli jsme si, že trošku rozvíříme vody a vyzpovídali jsme naše kolegyně z “…

V kategorii Život v Kentico

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

Chcete poznat technologie, se kterými v Kentico pracujeme? Přeložili jsme pro vás na ukázku sérii článků vztahující se k jednomu z našich open source projektů. Bude řeč o silném typování v Kentico Clo…

V kategorii Development

Open space a houpačky? Nemáme a nechceme, protože...

Kanceláře na Nových sadech jsou už naše třetí v pořadí. I proto jsme přesně věděli, jaké by měly být, a taky co tam určitě mít nechceme. Ve výběru nám pomáhali lidé z jednotlivých týmů.

V kategorii Život v Kentico