共用方式為


計算和自訂的儲存體屬性

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

定義域專屬語言 (DSL) 中的所有網域屬性可以在圖表上和您語言總管中,對使用者顯示,並可由程式碼存取。 不過,屬性與其值的儲存方式的不同。

網域屬性的種類

在 DSL 定義中,您可以設定種類網域屬性,如下列表格所列︰

網域屬性類型 說明
標準(預設值) 儲存在網域屬性儲存和序列化至檔案。
計算 唯讀網域屬性不會儲存在存放區,但從其他值的計算。

例如,Person.Age無法從計算Person.BirthDate

您必須提供執行計算的程式碼。 一般而言,您會計算來自其他網域屬性的值。 不過,您也可以使用外部資源。
自訂儲存體 網域屬性不會儲存在存放區中,直接,但可以是 get 和 set。

您必須提供方法來取得及設定值。

例如,Person.FullAddress可以儲存在Person.StreetAddressPerson.City,和Person.PostalCode

您也可以存取外部資源,例如若要取得及設定資料庫中的值。

您的程式碼不應該設定存放區中的值時Store.InUndoRedoOrRollback為 true。 請參閱交易和自訂 Setter。

提供程式碼計算或自訂的儲存體屬性

如果您將網域屬性的類型為計算或自訂儲存體,您必須提供存取方法。 當您建置方案時,錯誤報表會告訴您為何需要。

若要定義導出或自訂儲存體屬性

  1. 在 DslDefinition.dsl 中,選取的網域屬性,無論是在圖表中或DSL Explorer

  2. 屬性視窗中,設定種類欄位計算自訂儲存體

    請確定您已也設定其類型符合您的需求。

  3. 按一下 [轉換所有範本的工具列中的方案總管] 中

  4. 在 [建置 Customizing the&2007; Microsoft Office System Ribbon ] 功能表上,按一下 [建置方案 How to: Get Started Customizing the Ribbon]。

    您收到下列錯誤訊息: 「YourClass未包含定義 getYourProperty。 」

  5. 按兩下錯誤訊息。

    Dsl\GeneratedCode\DomainClasses.cs 或 DomainRelationships.cs 隨即開啟。 上述反白顯示的方法呼叫中,註解會提示您提供實作 getYourProperty()。

    注意

    這個檔案會產生從 DslDefinition.dsl。 如果您編輯此檔案,您的變更將會遺失您按一下 [下一次轉換所有範本。 相反地,在不同的檔案中加入所需的方法。

  6. 建立或開啟類別檔案中個別的資料夾,例如應付\YourDomainClass。 cs。

    確定命名空間是產生的程式碼相同。

  7. 在類別檔案中,撰寫部分網域類別的實作。 在類別中,撰寫遺漏的定義Get與下列範例類似的方法︰

    namespace Company.FamilyTree  
    {  public partial class Person  
       {  int GetAgeValue()  
          { return System.DateTime.Today.Year - this.BirthYear; }  
    }  }  
    
  8. 如果您設定種類自訂儲存體,您也必須提供Set方法。 例如:

    void SetAgeValue(int value)  
    { if (!Store.InUndoRedoOrRollback)  
        this.BirthYear =   
            System.DateTime.Today.Year - value; }  
    

    您的程式碼不應該設定存放區中的值時Store.InUndoRedoOrRollback為 true。 請參閱交易和自訂 Setter。

  9. 建置並執行方案。

  10. 測試屬性。 請確定您嘗試復原重做

交易和自訂 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);  
}  

如需有關交易的詳細資訊,請參閱巡覽和更新程式碼中的模型

另請參閱

巡覽和更新程式碼中的模型
網域屬性的屬性
如何定義定義域專屬語言