👯
DDDでのDTOの使い所
概要
DDD関連の記事や書物を読む中で、 「DTO」が出てくることがちょくちょくありました。
なので、DDDとDTOの関連性を簡単にまとめてみようと思います。
いつDTOを使う?
➡️ユースケース層からプレゼンテーション層へ返す際にDTOに詰め替えて返す時
詰め替えて返すと良いことあるの?
ドメインオブジェクトに、プレゼンテーション層に関連する処理が混入するのを防ぐため。
エンティティが持つメソッドを、プレゼンテーション層で使えてしまうことを防ぐため。
また、DTOをかませることで、ドメイン層の修正の影響をプレゼンテーション層が直接受けなくなる。
どこにDTOを置くべき?
各ユースケースごとに置くのが好ましい。
DTOとユースケースの関係性が追いやすくなるため。
サンプルフォルダ構造は下記。
- Usecase
- User
- UesrUsecase
- UesrUsecaseDto
- Item
- ItemUsecase
- ItemUsecaseDto
他の場面でもDTOでの詰め替えはしてもよいのか?
よい。
ユースケース層からプレゼンテーション層に値を返す時に限った話ではない。
プレゼンテーション層、ドメイン層、ユースケース層、インフラストラクチャ層、それぞれをまたぐ時にDTOに詰め替えて渡してもよい。
しかし、やりすぎは無論コストもかかるので注意。
もちろん必ずしもレイヤーをまたがる際に、詰め替える必要はない。
そのままの形で渡す方針もあれば、DTOなどにデータを積み替えるパターンもあるのでプロジェクトによるといった所でしょうか。
参照
Discussion