Počítané a vlastní vlastnosti úložiště
Všechny vlastnosti domény v jazyce specifickém pro doménu (DSL) se dají uživateli zobrazit v diagramu a v průzkumníku jazyků a dají se k němu přistupovat pomocí kódu programu. Vlastnosti se ale liší způsobem, jakým jsou jejich hodnoty uloženy.
Typy vlastností domény
V definici DSL můžete nastavit druh vlastnosti domény, jak je uvedeno v následující tabulce:
Druh vlastnosti domény | Popis |
---|---|
Standardní (výchozí) | Vlastnost domény uložená v úložišti a serializovaná do souboru. |
Vypočítá | Vlastnost domény jen pro čtení, která není uložena v úložišti, ale počítá se z jiných hodnot. Lze například Person.Age vypočítat z Person.BirthDate . Musíte zadat kód, který provádí výpočet. Obvykle vypočítáte hodnotu z jiných vlastností domény. Můžete ale také použít externí prostředky. |
Vlastní úložiště | Vlastnost domény, která není uložena přímo v úložišti, ale může být jak získat, tak nastavit. Musíte zadat metody, které získají a nastaví hodnotu. Například Person.FullAddress mohou být uloženy v Person.StreetAddress , Person.City a Person.PostalCode . Můžete také přistupovat k externím prostředkům, například získat a nastavit hodnoty z databáze. Pokud je váš kód pravdivý, neměl by v úložišti Store.InUndoRedoOrRollback nastavovat hodnoty. Viz Transakce a vlastní settery. |
Poskytnutí kódu pro vlastnost úložiště
Pokud nastavíte typ vlastnosti domény na počítané nebo vlastní úložiště, musíte poskytnout metody přístupu. Při sestavování řešení vám zpráva o chybách řekne, co je potřeba.
Definování počítané nebo vlastní vlastnosti úložiště
V DslDefinition.dsl vyberte vlastnost domény buď v diagramu, nebo v DSL Exploreru.
V okně Vlastnosti nastavte pole Druh na Počítané nebo Vlastní úložiště.
Ujistěte se, že jste také nastavili jeho typ na to, co chcete.
Na panelu nástrojů Průzkumník řešení vyberte Transformovat všechny šablony.
V nabídce Sestavení vyberte Sestavit řešení.
Zobrazí se následující chybová zpráva:< YourClass> neobsahuje definici pro Get<YourProperty>.
Poklikejte na chybovou zprávu.
Otevře se Dsl\GeneratedCode\DomainClasses.cs nebo DomainRelationships.cs . Nad zvýrazněným voláním metody se zobrazí výzva k zadání implementace pro Get<YourProperty>().
Poznámka:
Tento soubor je generován z DslDefinition.dsl. Pokud tento soubor upravíte, změny se při příštím výběru možnosti TransformOvat všechny šablony ztratí. Místo toho přidejte požadovanou metodu do samostatného souboru.
Vytvořte nebo otevřete soubor třídy v samostatné složce, například CustomCode\<YourDomainClass.cs>.
Ujistěte se, že obor názvů je stejný jako ve vygenerovaném kódu.
V souboru třídy zapište částečnou implementaci třídy domény. Ve třídě napište definici chybějící
Get
metody, která se podobá následujícímu příkladu:namespace Company.FamilyTree { public partial class Person { int GetAgeValue() { return System.DateTime.Today.Year - this.BirthYear; } } }
Pokud nastavíte kind na vlastní úložiště, musíte také zadat metodu
Set
. Příklad:void SetAgeValue(int value) { if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value; }
Pokud je váš kód pravdivý, neměl by v úložišti
Store.InUndoRedoOrRollback
nastavovat hodnoty. Viz Transakce a vlastní settery.Sestavte a spusťte řešení.
Otestujte vlastnost. Ujistěte se, že zkusíte vrátit zpět a znovu.
Transakce a vlastní settery
set
V metodě Custom Storage vlastnost nemusíte otevřít transakci. Metoda je obvykle volána uvnitř aktivní transakce.
Metoda však může být volána také v případě, set
že uživatel vyvolá Zpět nebo Znovu, nebo pokud se transakce vrací zpět. Pokud InUndoRedoOrRollback je hodnota true, měla by se vaše set
metoda chovat takto:
V úložišti by neměl provádět změny, například přiřazování hodnot k jiným vlastnostem domény. Správce vrácení zpět nastaví své hodnoty.
Měl by ale aktualizovat všechny externí prostředky, jako je databáze nebo obsah souboru nebo objekty mimo úložiště. Tento přístup zajišťuje synchronizaci s hodnotami v úložišti.
Příklad:
void SetAgeValue(int value) { // If we are in Undo, no changes to Store objects: if (!this.Store.InUndoRedoOrRollback) { this.BirthYear = System.DateTime.Today.Year - value; } // But always update external objects: System.IO.File.WriteAllText(AgeFile, value); }
Další informace o transakcích naleznete v tématu Navigace a aktualizace modelu v kódu programu.