計算プロパティおよびカスタム ストレージ プロパティ

ドメイン固有言語 (DSL) のすべてのドメイン プロパティをダイアグラム上と言語エクスプローラー内でユーザーに表示して、プログラム コードでアクセスすることができます。 ただし、プロパティの値が格納される方法は異なります。

ドメイン プロパティの種類

DSL 定義では、次の表に示すように、ドメイン プロパティの "種類" を設定できます。

ドメイン プロパティの種類 説明
標準 (既定) ストアに保存され、ファイルにシリアル化されるドメイン プロパティ。
Calculated ストアに保存されていないが、他の値から計算される読み取り専用のドメイン プロパティ。 たとえば、Person.AgePerson.BirthDate から計算できます。 計算を実行するコードを指定する必要があります。 通常は、他のドメイン プロパティから値を計算します。 ただし、外部リソースを使用することもできます。
カスタム ストレージ ストアに直接保存されるのではなく、get と set の両方にすることができるドメイン プロパティ。 値を取得および設定するメソッドを指定する必要があります。 たとえば、Person.FullAddress は、Person.StreetAddressPerson.CityPerson.PostalCode に格納できます。 たとえばデータベースから値を取得して設定するために、外部リソースにアクセスすることもできます。 Store.InUndoRedoOrRollback が true の場合、コードでストアの値を設定することはできません。 「トランザクションとカスタム Setter」を参照してください。

ストレージのプロパティのコードを指定

ドメイン プロパティの [種類] を [計算済み] または [カスタム ストレージ] に設定する場合は、アクセス方法を指定する必要があります。 ソリューションをビルドすると、必要なものがエラー レポートに表示されます。

計算済みまたはカスタム ストレージのプロパティを定義するには

  1. DslDefinition.dsl で、ダイアグラムまたは DSL エクスプローラーのいずれかでドメイン プロパティを選択します。

  2. [プロパティ] ウィンドウで、 [種類] フィールドを [計算済み] または [カスタム ストレージ] に設定します。

    また、その [タイプ] が必要なものに設定されていることも確認します。

  3. ソリューション エクスプローラーのツール バーで、[すべてのテンプレートの変換] を選択します。

  4. [ビルド] メニューの [ソリューションのビルド] を選択します。

    次のエラー メッセージが表示されます。"<YourClass> に Get<YourProperty> の定義が含まれていません。"

  5. エラー メッセージをダブルクリックします。

    Dsl\GeneratedCode\DomainClasses.cs または DomainRelationships.cs が開きます。 強調表示されたメソッド呼び出しの上に、Get<YourProperty>() の実装の指定を要求するコメントが表示されます。

    注意

    このファイルは、DslDefinition.dsl から生成されます。 このファイルを編集すると、次回 [すべてのテンプレートの変換] を選択したときに変更内容が失われます。 代わりに、必要なメソッドを別のファイルに追加します。

  6. クラス ファイルを作成するか、別のフォルダーで開きます (たとえば、CustomCode\<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. プロパティをテストします。 UndoRedo を試行するようにしてください。

トランザクションとカスタム Setter

カスタム ストレージのプロパティの set メソッドでは、トランザクションを開く必要はありません。 このメソッドは通常、アクティブなトランザクション内で呼び出されます。

ただし、ユーザーが Undo または Redo を呼び出した場合、またはトランザクションがロールバックされている場合にも、set メソッドを呼び出すことができます。 InUndoRedoOrRollback が true の場合、set メソッドは次のように動作します。

  • 他のドメイン プロパティに値を割り当てるなど、ストアに変更を加えることはできません。 これらの値は、アンドゥ マネージャーによって設定されます。

  • ただし、データベースやファイルの内容などの外部リソースや、ストアの外部にあるオブジェクトを更新する必要があります。 この方法により、ストア内の値との同期状態が維持されます。

    次に例を示します。

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

トランザクションの詳細については、「プログラム コードにおけるモデル内の移動およびモデルの更新」を参照してください。