共用方式為


計算及自訂的儲存區屬性

定義域專屬語言 (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。

為計算結果或自訂儲存體屬性提供程式碼

如果您設定為 [計算] 或 [自訂存放的定義域屬性的類型,您必須提供存取方法。當您建置方案時,錯誤報告將告訴您為何需要。

若要定義的計算或自訂儲存體屬性

  1. 在 DslDefinition.dsl 中,選取的網域內容在圖表中或在 DSL 總管

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

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

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

  4. 在 [建置] 功能表上,按一下 [建置方案]。

    您會收到下列錯誤訊息: 「YourClass 中沒有定義為取得YourProperty。"

  5. 按兩下錯誤訊息。

    Dsl\GeneratedCode\DomainClasses.cs 或 DomainRelationships.cs 會開啟。上面以粗體顯示的方法呼叫中,註解會提示您提供的實作,為取得YourProperty()。

    注意事項注意事項

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

  6. 建立或開啟的類別檔案,在單獨的資料夾,例如 CustomCode\YourDomainClass。 cs。

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

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

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

          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);
}

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

請參閱

參考

網域屬性的屬性

概念

巡覽及更新程式碼中的模型

如何定義網域指定的語言