Naše technologie: silné typování obsahu v .NET (2. díl)
Práce v Kentico, Produkty

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 Cloud? 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!

Autor

Jan Lenoch

Developer Trainer

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.

Další podobné články

Prst na tepu doby – přepisujeme knihovny do .NET Core

Když začal Petr Palas, CEO Kentico, v roce 2004 psát první verzi svého produktu, vytvářel jednoduchý systém pro správu obsahu postavený na platformě Microsoft .NET. Od té doby u...

Chci vědět víc

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

Chci vědět víc

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í...

Chci vědět víc