計算プロパティおよびカスタム ストレージ プロパティ
ドメイン固有言語 (DSL) のすべてのドメイン プロパティをダイアグラム上と言語エクスプローラー内でユーザーに表示して、プログラム コードでアクセスすることができます。 ただし、プロパティの値が格納される方法は異なります。
ドメイン プロパティの種類
DSL 定義では、次の表に示すように、ドメイン プロパティの "種類" を設定できます。
ドメイン プロパティの種類 | 説明 |
---|---|
標準 (既定) | ストアに保存され、ファイルにシリアル化されるドメイン プロパティ。 |
Calculated | ストアに保存されていないが、他の値から計算される読み取り専用のドメイン プロパティ。 たとえば、Person.Age は Person.BirthDate から計算できます。 計算を実行するコードを指定する必要があります。 通常は、他のドメイン プロパティから値を計算します。 ただし、外部リソースを使用することもできます。 |
カスタム ストレージ | ストアに直接保存されるのではなく、get と set の両方にすることができるドメイン プロパティ。 値を取得および設定するメソッドを指定する必要があります。 たとえば、Person.FullAddress は、Person.StreetAddress 、Person.City 、Person.PostalCode に格納できます。 たとえばデータベースから値を取得して設定するために、外部リソースにアクセスすることもできます。 Store.InUndoRedoOrRollback が true の場合、コードでストアの値を設定することはできません。 「トランザクションとカスタム Setter」を参照してください。 |
ストレージのプロパティのコードを指定
ドメイン プロパティの [種類] を [計算済み] または [カスタム ストレージ] に設定する場合は、アクセス方法を指定する必要があります。 ソリューションをビルドすると、必要なものがエラー レポートに表示されます。
計算済みまたはカスタム ストレージのプロパティを定義するには
DslDefinition.dsl で、ダイアグラムまたは DSL エクスプローラーのいずれかでドメイン プロパティを選択します。
[プロパティ] ウィンドウで、 [種類] フィールドを [計算済み] または [カスタム ストレージ] に設定します。
また、その [タイプ] が必要なものに設定されていることも確認します。
ソリューション エクスプローラーのツール バーで、[すべてのテンプレートの変換] を選択します。
[ビルド] メニューの [ソリューションのビルド] を選択します。
次のエラー メッセージが表示されます。"<YourClass> に Get<YourProperty> の定義が含まれていません。"
エラー メッセージをダブルクリックします。
Dsl\GeneratedCode\DomainClasses.cs または DomainRelationships.cs が開きます。 強調表示されたメソッド呼び出しの上に、Get<YourProperty>() の実装の指定を要求するコメントが表示されます。
注意
このファイルは、DslDefinition.dsl から生成されます。 このファイルを編集すると、次回 [すべてのテンプレートの変換] を選択したときに変更内容が失われます。 代わりに、必要なメソッドを別のファイルに追加します。
クラス ファイルを作成するか、別のフォルダーで開きます (たとえば、CustomCode\<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」を参照してください。ソリューションをビルドして実行します。
プロパティをテストします。 Undo と Redo を試行するようにしてください。
トランザクションとカスタム 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); }
トランザクションの詳細については、「プログラム コードにおけるモデル内の移動およびモデルの更新」を参照してください。