ドメインオブジェクトがドメイン層の機能を果たす様にするため、その生成時に複雑な処理が必要になります。当方では生成時に次のような処理を行っています。
- 所有する値オブジェクトの生成
- 所有する子エンティティリストの生成
- 参照しているエンティティへの Null Object の生成
- 変更通知機能(INotifyPropertyChanged)の注入
- 編集・取消機能(IEditableObject)の注入
- 変更トラッキング機能の注入
- 継承の解決
これら生成時の処理の多くは開発するアプリケーションのドメインに依存しない処理となります。そこで生成の機能をファクトリにまとめ、ドメインオブジェクトから分離しています。
生成するドメインオブジェクトはその機能によって下記の3種類に分類しています。
分類 | 目的 | 動作 |
---|---|---|
表示用 | 一覧表示および、一括更新のバッファとして使用 | プロパティは初回アクセス時に遅延評価 |
編集用 | 編集画面で編集に使用 | 変更通知機能、変更・取消機能・変更トラッキング機能を注入 |
Null Object用 | あるオブジェクトが別のエンティティを参照するプロパティを持っている場合(例えば、伝票エンティティが得意先マスタプロパティを持っている場合)、プロパティの初期値および該当するエンティティがない場合の値として使用 | プロパティリードは常に型の既定値を返す。プロパティライトは例外発生、Null Objectは1つの型に1つのインスタンスのみ生成されることを保証 |
これらはUnity依存性注入コンテナ
を利用した3種類のビヘイビアを用意して、生成時に使い分けています。
生成時の処理の内、継承の解決はドメインに依存します。データベースで継承を表す方法として、シングルテーブル継承
・クラステーブル継承
・具象テーブル継承
があります。このうちシングルテーブル継承を当方はよく使います。例えば販売管理で売上と入金がありこれを別のテーブルで管理しないで1つの伝票というテーブルで管理し、伝票区分コードというカラムによって売上と仕入を識別しています。データベースからエンティティをロードするとき伝票区分コードによって売上
オブジェクトを作成するか仕入
オブジェクトを作成するかを振り分けます。