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

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 Cloud Delivery .NET SDK. Ve třetím díle se dozvíte, jak implementovat dědičnost mezi typy.

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. Na co se můžete těšit? 

Jak si poradit s implementací dědičnosti?

Další zajímavé téma, které se týká silného typování, je dědičnost. V tuto chvíli ještě typy obsahu (content types) v Kentico Cloud nepodporují dědičnost – zkrátka od sebe neumějí dědit elementy a jiná nastavení. To nám ale nezabránilo, abychom přišli s rozumnou implementací dědičnosti na straně klientské aplikace.

Pojďme si to ukázat na příkladu

V naší ukázkové MVC aplikaci máme typy obsahu Coffee (káva), Brewer (kávovar), Grinder (mlýnek) a Accessory (příslušenství). Všechny tyto typy představují nějakou formu produktu. A všechny mají společné tyto properties:

  • Product name
  • Price
  • Image
  • Product status
  • Short description
  • Long description

Pokud bychom změnili property v jednom typu obsahu, ostatní typy obsahu to neovlivní. Proto se naše SDK a generátor typů chovají stejně a nesnaží se vztahy dědičnosti samy implementovat. Implementaci dědičnosti můžete provést v kódu klientské aplikace. 

Jak tedy zařídit, abyste mohli upravovat a odkazovat se na jednu společnou property namísto několika samostatných? 

Generátor typů vytvoří například tyto dvě jednoduché třídy:

public partial class Coffee
{
    public string ProductName { get; set; }
}
public partial class Brewer
{
    public string ProductName { get; set; }
}

Za této situace už nemůžete napsat společnou nadřazenou (base) třídu Product se stejnou property ProductName a dědit z ní:

public class Product
{
    public string ProductName { get; set; }
}

Existují dva způsoby, jak z kruhu ven

První a jednodušší cestou můžete jít, pokud budete v aplikaci chtít pracovat pouze s těmi properties, které se nacházejí ve všech typech obsahu. Druhou, lehce náročnější cestu zvolte ve všech ostatních případech.

1) První způsob: deserializace do nadřazeného typu

Tímto jednodušším způsobem zajistíte, že budete moci pracovat s property ProductName u typu Product, ne u typů Coffee, Brewer atd. Stačí napsat třídu Product se společnými properties, opatřit je JsonProperty atributy nesoucími kódové názvy elementů v Kentico Cloud:

public class Product
{
    [JsonProperty("product_name")]
    public string ProductName { get; set; }

    [JsonProperty("price")]
    public decimal? Price { get; set; }

    // Jiné properties ...
}

I přesto, že v Kentico Cloud nemáte žádný typ obsahu Product, dokáže náš výchozí CodeFirstPropertyMapper při každém API requestu svázat vaše properties s odpovídajícími elementy podřízených typů obsahu jako Coffee nebo Brewer. Díky tomu můžete získat kolekci objektů Product standardním voláním metody GetItemsAsync:

List<Product> brewersAndCoffeeAsProducts = (await client.GetItemsAsync<Product>(new InFilter("system.type", "brewer", "coffee"))).Items.ToList();

Je ovšem dobré dát si pozor, aby elementy ve podřízených typech obsahu byly pojmenovány konzistentně – pokaždé jako ProductName.

2) Druhý způsob: doprovodné properties

Druhý – trochu náročnější způsob vám dovolí, abyste v kódu dále používali nejen properties, které jsou všem typům společné, ale i ty ostatní properties. Pokud tedy potřebujete se získaným obsahem pracovat nejen jako s typem Product, ale i jako například s typem Coffee, zvolte tento způsob.

Nejprve je potřeba podřízeným třídám nastavit dědění z nadřazené (Product). V podřízených třídách byste pak měli přidat ke společným properties jejich doprovodné, které obalí ty původní:

public partial class Coffee : Product
{
    public override string ProductProductName
    {
        get { return ProductName; }
        set { ProductName = value; }
    }

    public override decimal? ProductPrice
    {
        get { return Price; }
        set { Price = value; }
    }

    // Ostatní properties ...
}

Od této chvíle je možné volat důvěrně známou metodu GetItemsAsync, tentokrát však s typovým parametrem <object>. (Takový způsob volání jsme si interně nazvali „typování za běhu“; dočtete se o něm příště.)

var brewersAndCoffeeAsProducts = (await client.GetItemsAsync<object>(new InFilter("system.type", "brewer", "coffee"))).Items;

Díky tomu už bude možné dělat obojí: jak pracovat jednotným způsobem se všemi společnými properties, tak přistupovat i ke všem ostatním.

foreach (var product in brewersAndCoffeeAsProducts)
{
product.ProductProductName += " (discounted)";
    if (product is Coffee)
    {
        product.ShortDescription += " The price is now lower, the aroma stayed the same.";
    }
}

A co dál? To je na vás. 

V tomto díle jste se dozvěděli, jak mít dědičnost v klientské aplikaci i přesto, že ji Kentico Cloud ještě prozatím nepodporuje. To se ale může velmi rychle změnit, hlavně podle vašich přání. Jakmile podporu dědičnosti zavedeme, můžete například připomínkami nebo vlastním kódem ovlivnit, jak bude dědičnost vypadat v Delivery .NET SDK a generátoru typů

Jak vidíte, skvělé headless CMS v cloudu můžete vytvářet s námi.

Chcete si číst dál?

Pro čerstvé tatínky máme dva týdny navíc

Už dávno nejsme typická studentská firma. Po chodbách se nám prohání děti různého věku a na naše bujaré letní párty se vloudily skákací hrady a šlapací autíčka. Z vlastní zkušenosti vím…

V kategorii Život v Kentico

Proč bude rok 2017 rokem cloudových CMS

Když v roce 1979 Steve Jobs poprvé uviděl grafické uživatelské rozhraní v laboratořích Xerox, okamžitě pochopil, že v něm spočívá budoucnost osobních počítačů. „Bylo to jasné na první pohled. Mohli js…

V kategorii Kentico Cloud

B2B marketing je pro mě větší výzva

Ačkoliv se Martina Hatoňová ucházela původně o pozici Junior UX Designera, osud tomu chtěl jinak. Kolegové si přeposlali její životopis a Martina nastoupila do marketingového oddělení, ve kterém pracu…

V kategoriích Rozhovory a Marketing

Potkejte se s námi offline

  • TestCrunch 2018

    Kamil bude povídat o zastupitelnosti testerských a developerských rolí napříč agilním týmem, Matej zase o našem UI testovacím frameworku a jeho postupném vylepšování.

  • Unihunt v Brně

    Jak poznáte, že se z někoho stal seniorní UX designér? Že by podle nejbarevnější sbírky post-itů? Nebo podle počtu stříbrných vlasů? Náš kolega Tadeáš Kubát vám odpoví! Přijďte si ho 24. 11. poslechnout na Unihunt a poznejte bodový systém, který s UX týmem vymysleli.