Dajbych.net


Vytváření modelu pohledu nad úložištěm dat aplikace

, 2 minuty čtení

windows 8 logo

Aplikace ve stylu Metro musí obsahovat masivní lokální mezipaměť, aby bylo možné dosáhnout rychlého a plynulého uživatelského zážitku. Vzhledem k tomu, že data mohla být aktualizována pouze úlohou na pozadí, musí být každý datový model uložen v lokálním datovém úložišti aplikace. Když jsem psal kód pro přenos dat aplikace mezi třídami modelu a místním úložištěm, uvědomil jsem si, že mohu napsat malou vrstvu, která tuto práci za mě provede automaticky. Tento článek popisuje, jak jej používat.

Architektura je poměrně jednoduchá a známá pro ty, kteří vyvíjejí aplikace pro Windows Phone. Data jsou uložena v databázi nebo v lokálních souborech. Databázový přístup odvozuje výhody z Entity Frameworku. Je jednoduchý, efektivní a dostatečně robustní. Alternativní přístup odvozuje výhody z objektově orientovaného úložiště WinRT. Umožňuje ukládat opakující se struktury i páry klíčů a hodnot. To však nestačí. Toto úložiště postrádá mechanismus pro ukládání vlastní třídy, která obsahuje kolekci jiné vlastní třídy, která obsahuje dvě kolekce ještě další vlastní třídy. Tento mechanismus jsem musel naprogramovat při vývoji jedné z prvních aplikací pro Windows 8.

Aby bylo možné synchronizovat data modelu s úložištěm dat místní aplikace, musí být odvozena z třídy ModelStorageBase. To se podobá Entity Frameworku, kde základní třída je DbContext. Dále musí být každá vlastnost kódována takto:

public class Model : ModelStorageBase {

    public Model() : base("Model") { }

    public string ScalarProperty {
        get { return GetValueProperty<string>(); }
        set { SetValueProperty(value); }
    }

    public ModelStorageReferenceCollection<Item> CollectionProperty {
        get { return GetReferenceCollection<Item>(); }
    }

}

public class Item : ModelStorageBase {

    public Item() : base() { }

    public string ScalarProperty {
        get { return GetValueProperty<string>(); }
        set { SetValueProperty(value); }
    }

    public ModelStorageValueCollection<int> CollectionProperty {
        get { return GetValueCollection<int>(); }
    }

}

Konstruktor definuje klíč používaný k ukládání dat třídy. ScalarProperty používá odvozenou metodu k uložení nebo načtení své hodnoty. *ModelStorageBase implementuje INotifyPropertyChanged, takže se nemusíte starat o událost oznámení změny vlastnosti vícesměrového vysílání. Ustanovení § CollectionProperty je kolekce, která obsahuje položky, jejichž typ je odvozen z § CacheableBase. Kolekce je inicializována automaticky, takže nepotřebuje setter. Typ ModelStorageReferenceCollection<T> je odvozen od ObservableCollection<T>, což znamená, že si nemusíte dělat starosti s oznámeními o změnách. Tento typ obsahuje také alternativu k metodě Add. Metoda AddOrUpdate je velmi užitečná, pokud chcete aktualizovat existující položky, které jsou již obsaženy v kolekci. To se obvykle používá při úloze na pozadí, která aktualizuje data. Hodnota CollectionProperty vrátí typ ModelStorageValueCollection<T>, který se používá, když je T primitivní typ.

Všechny třídy tohoto malého frameworku jsou k dispozici v mém balíčku ModelStorage Nuget. Zdrojový kód je k dispozici na Codeplexu. Doufám, že se vám to bude hodit.