DTOって何?

多くのところでDTOって言葉をつかっているけど、それって本当にDTOなのと思えるようなものがある。

PofEAAではDTOはメソッド呼び出しを減らすためにプロセス間でデータを運ぶオブジェクトとなっています。
ローカルDTOの議論はありますが、DTOはすくなくともデータを運ぶ目的で利用するものです。

典型的にはサービス層で作成されるサービスのメッセージにDTOが利用されます。

しかし、DTOは通常Valueオブジェクトで作成されるため、単なるValueオブジェクトことをDTOを言っている場合があります。たとえば、住所や国際通貨、単位付数量などはValueオブジェクトですがDTOではないです。*1

また、DTOが画面側に渡されることから、DTOを画面で利用するデータという意味づけが強くなっていることもあります。この結果、DTOが特定のUIの構造に結びつけられて画面の構造が変化するとサービス層が影響を受けるとことになってしまいます。

たとえば単純な編集画面でも、検索時は他のマスタなどのデータを結合した構造で、更新時は登録データのみの構造でサービス層とやり取りすることになります。画面データとしてDTOを考えてしまうと、更新時のサービスのメッセージが検索のメッセージ構造によって影響を受けるという状態になってしまいます。*2

確かに、機能を実現するためにサービス層を作成した業務アプリの場合、DTOを利用して画面ロジックを記述することも多くの場合可能であるが、これはたまたま利用できているだけと考えるべきです。
DTOはあくまでもサービス層の観点で構築し、画面データとして無理やり使わずに複雑になったばあいにはプレゼンテーションモデルを導入すべきだと考えています。

*1:ここではEntityオブジェクトに対比した用語としてのValueオブジェクトという意味を使っています

*2:.NETでデータバインドのデータソースとしてDTOをそのまま利用する場合に良く起こります