データ転送オブジェクトのプロパティが外部キーを展開するか、単に主キーを公開する必要があります
-
28-10-2019 - |
質問
データベース内の従業員レコードを表すEmployeeDTOがあります。Employeeテーブルには、Departmentとの関係、およびPermissionとの1対多の関係があります。
私のエンティティでは、これらは完全に拡張されたDepartmentプロパティと完全に拡張された権限オブジェクトのリストとして表されます。
問題は、DTOにDepartmentIdの完全に拡張されたDepartmentDTOプロパティを含める必要があるかどうかです。DTOには、List of PermissionIdの完全に拡張されたPermissionDTOプロパティのリストが必要ですか?
解決
デザインのすべてと同じように、それはあなたのニーズに依存します。
- 頻繁に確認する必要がある場合 子プロパティにバインドし、必要な できるだけ簡単にするために 開発者がDTOを使用する場合は、 明示的なファクトリメソッドで 子プロパティを完全に拡張しました。
- コードを単純にしたい場合は、しないでください
外部キープロパティを展開し、
開発者に子供をもらいましょう
キーで必要なオブジェクト/コレクション
必要に応じて。
再帰で問題が発生する可能性があります。また、Departmentオブジェクトのすべての外部キープロパティも展開しますか? Departmentのサブクラスに別のEmployeeDTOへの参照がある場合はどうなりますか?
MicrosoftのEntityFrameworkやその他の一般的なビジネスオブジェクトフレームワークは、遅延読み込みによってこの概念を処理します。コードで要求された場合にのみ、完全に展開された子プロパティをフェッチします。これはおそらく最も柔軟なソリューションですが、親オブジェクトと同じデータベース呼び出しで子プロパティをフェッチできないため、オーバーヘッド/ラグが少しあります。もちろん、これらは純粋なDTOではありません。
他のヒント
はい、いいえ。これは、呼び出しと、すべての呼び出しですべての追加プロパティが必要かどうかによって異なります。また、使用するORMテクノロジーに依存する可能性があり、遅延読み込みを実装して決定に影響を与える可能性があります(推奨されないが、ストレートエンティティオブジェクトを渡す場合)。
必要なすべてのプロパティを含む1つのケースDTOと、より多くの機能を公開して他のメソッドで使用される1つ以上のDTOオブジェクトを作成するのが一般的です。たとえば、BasicUser
とUserName
のみを含むDisplayName
クラスがあり、User
と `BasicUserからの継承を含むPermissions
があります。