計算和自訂的儲存體屬性
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
定義域專屬語言 (DSL) 中的所有網域屬性可以在圖表上和您語言總管中,對使用者顯示,並可由程式碼存取。 不過,屬性與其值的儲存方式的不同。
網域屬性的種類
在 DSL 定義中,您可以設定種類網域屬性,如下列表格所列︰
網域屬性類型 | 說明 |
---|---|
標準(預設值) | 儲存在網域屬性儲存和序列化至檔案。 |
計算 | 唯讀網域屬性不會儲存在存放區,但從其他值的計算。 例如, Person.Age 無法從計算Person.BirthDate 。您必須提供執行計算的程式碼。 一般而言,您會計算來自其他網域屬性的值。 不過,您也可以使用外部資源。 |
自訂儲存體 | 網域屬性不會儲存在存放區中,直接,但可以是 get 和 set。 您必須提供方法來取得及設定值。 例如, Person.FullAddress 可以儲存在Person.StreetAddress , Person.City ,和Person.PostalCode 。您也可以存取外部資源,例如若要取得及設定資料庫中的值。 您的程式碼不應該設定存放區中的值時 Store.InUndoRedoOrRollback 為 true。 請參閱交易和自訂 Setter。 |
提供程式碼計算或自訂的儲存體屬性
如果您將網域屬性的類型為計算或自訂儲存體,您必須提供存取方法。 當您建置方案時,錯誤報表會告訴您為何需要。
若要定義導出或自訂儲存體屬性
在 DslDefinition.dsl 中,選取的網域屬性,無論是在圖表中或DSL Explorer。
在屬性視窗中,設定種類欄位計算或自訂儲存體。
請確定您已也設定其類型符合您的需求。
按一下 [轉換所有範本的工具列中的方案總管] 中。
在 [建置 Customizing the&2007; Microsoft Office System Ribbon ] 功能表上,按一下 [建置方案 How to: Get Started Customizing the Ribbon]。
您收到下列錯誤訊息: 「YourClass未包含定義 getYourProperty。 」
按兩下錯誤訊息。
Dsl\GeneratedCode\DomainClasses.cs 或 DomainRelationships.cs 隨即開啟。 上述反白顯示的方法呼叫中,註解會提示您提供實作 getYourProperty()。
注意
這個檔案會產生從 DslDefinition.dsl。 如果您編輯此檔案,您的變更將會遺失您按一下 [下一次轉換所有範本。 相反地,在不同的檔案中加入所需的方法。
建立或開啟類別檔案中個別的資料夾,例如應付\YourDomainClass。 cs。
確定命名空間是產生的程式碼相同。
在類別檔案中,撰寫部分網域類別的實作。 在類別中,撰寫遺漏的定義
Get
與下列範例類似的方法︰namespace Company.FamilyTree { public partial class Person { int GetAgeValue() { return System.DateTime.Today.Year - this.BirthYear; } } }
如果您設定種類至自訂儲存體,您也必須提供
Set
方法。 例如: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);
}
如需有關交易的詳細資訊,請參閱巡覽和更新程式碼中的模型。