計算及自訂的儲存區屬性
定義域專屬語言 (DSL) 的所有網域內容可以顯示給使用者在圖表上,並在您的語言總管] 中,並可由程式碼存取。不過,屬性會在它們的值會儲存的方式不同。
網域屬性的種類
在 DSL 定義中,您可以設定類的定義域屬性,如下列表格中所列:
網域屬性類型 |
描述 |
---|---|
標準 (預設值)。 |
網域屬性儲存在儲存和序列化至檔案。 |
計算 |
唯讀網域屬性不會儲存在存放區,而從其他的值計算出來。 例如, Person.Age可能會算出從Person.BirthDate。 您必須提供的程式碼,以便在執行計算。一般而言,您會計算來自其他網域屬性的值。不過,您也可以使用外部資源。 |
自訂儲存 |
網域屬性不是直接存到儲存區,但可以將這兩個取得或設定。 您必須提供方法來取得及設定值。 For example, Person.FullAddress could be stored in Person.StreetAddress, Person.City, and Person.PostalCode. 您也可以存取外部資源,例如若要取得和設定資料庫中的值。 您的程式碼不應該設定存放區中的值時Store.InUndoRedoOrRollback為 true。請參閱交易與自訂 Setter。 |
為計算結果或自訂儲存體屬性提供程式碼
如果您設定為 [計算] 或 [自訂存放的定義域屬性的類型,您必須提供存取方法。當您建置方案時,錯誤報告將告訴您為何需要。
若要定義的計算或自訂儲存體屬性
在 DslDefinition.dsl 中,選取的網域內容在圖表中或在 DSL 總管。
在屬性 ] 視窗中,設定 類 欄位設 計算 或 自訂儲存。
請確定您已也設定其型別符合您的需求。
按一下 轉換所有的範本 的工具列中的 方案總管] 中。
在 [建置] 功能表上,按一下 [建置方案]。
您會收到下列錯誤訊息: 「YourClass 中沒有定義為取得YourProperty。"
按兩下錯誤訊息。
Dsl\GeneratedCode\DomainClasses.cs 或 DomainRelationships.cs 會開啟。上面以粗體顯示的方法呼叫中,註解會提示您提供的實作,為取得YourProperty()。
注意事項 這個檔案是從 DslDefinition.dsl 產生的。如果您編輯此檔案時,您的變更將會遺失您按一下 [下一次轉換所有的範本。相反地,在不同的檔案中新增所需的方法。
建立或開啟的類別檔案,在單獨的資料夾,例如 CustomCode\YourDomainClass。 cs。
請確定命名空間是與產生的程式碼相同。
類別檔案中寫入網域類別的部分的實作。在類別中,撰寫遺漏的定義取得方法,類似下列的範例:
namespace Company.FamilyTree { public partial class Person { int GetAgeValue() { return System.DateTime.Today.Year - this.BirthYear; } } }
如果您設定類 到 自訂儲存,您也必須提供 設定方法。例如:
void SetAgeValue(int value) { if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value; }
您的程式碼不應該設定存放區中的值時Store.InUndoRedoOrRollback為 true。請參閱交易與自訂 Setter。
建置並執行方案。
測試屬性。請確定您嘗試復原 和 重做。
交易和自訂 Setter
在自訂儲存屬性的 Set 方法,您不必開啟交易,因為通常會在使用中的交易內呼叫此方法。
不過,如果使用者叫用復原或取消復原,或是正在復原交易,可能也稱為 Set 方法。當InUndoRedoOrRollback為 true,Set 方法應該有的行為,如下所示:
它不應該存放區,例如將值指派給其他網域的內容中進行變更。復原管理員會設定它們的值。
不過,它應該更新任何外部資源,例如資料庫或檔案的內容或在存放區外的物件。這會確定就會繼續保存在 synchronism 中的存放區中的值。
例如:
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);
}
如需交易的詳細資訊,請參閱巡覽及更新程式碼中的模型。