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 Kontent 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 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ů. 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 Kontent 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 Kontent.

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

Kentico slovy Petra Palase #1: Kdo jsme a kam jdeme

Jaké bude Kentico za 10 let? Kolik zaměstnanců budeme mít v roce 2025? Do jakého produktu se pustíme po Kentico Kontent? Odpovědi na takové otázky by byly asi podobně přesné, jako kdybychom předpovída…

V kategorii Život v Kentico

Proč v Kentico refaktorujeme

S pojmem refaktoring se ve své profesi setkal snad každý vývojář. Jakýkoliv kód, který napíšete, začne nevyhnutelně zastarávat. Asi každý, kdo se podíval na své dílo s odstupem času, ví…

V kategorii Development

Aby se nám tu lépe žilo...

Věděli jste, že v České republice se vyprodukuje v průměru 30 mil. tun odpadu ročně? To jsou 3 tuny odpadu na osobu. Kdybychom každý rok viděli tu svou pěkně nasypanou v obýváku, asi bychom se pořádně…

V kategorii Život v Kentico