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:
- Výhody, generátor typů
- Získávání silně typovaného obsahu (tento díl)
- Implementace dědičnosti
- Typování za běhu – proč (již brzy)
- Typování za běhu – použití (již brzy)
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
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.