2009-04-08 12 views
7

すべてのビジネスクラスをクラスライブラリに入れてビジネスロジックで使用し、同じビジネスオブジェクトを境界クラスに渡すだけの場合は、DTO/Domainオブジェクトを使用する理由は何ですか?データ転送オブジェクト(DTO)のポイントは何ですか?

更新日: すべては素晴らしい点です。ありがとうございました。フォローアップの質問:

通常、これらのDTOはどこに配置しますか?ドメインオブジェクトと並んで、つまり同じ名前空間にありますか?

namespace MedSched.Medical 
{ 
    public class MedicalGroup 
    { 
     //... 
    } 

    public class MedicalGroupDTO 
    { 
     //... 
    } 
} 

答えて

7
  • DTOのドメインモデルのための抽象化レイヤを提供します。したがって、モデルを変更して、サービスクライアントの契約を破ることはできません。これは、ビューとプロシージャーが基礎となるデータ・モデルの抽象レイヤーになるデータベース設計における一般的なプラクティスに似ています。
  • シリアライゼーション - データが公開されていない可能性があります。これは、シリアライゼーション属性を使用することで緩和される可能性がありますが、余分な情報が残っている可能性があります。
  • 明示的な契約と明示的な契約 - ドメインオブジェクトを公開することにより、完全なモデルを自由に使用できないため、クライアントに使用を解釈させることができます。アソシエーションの有無に基づいて暗黙的にドメインオブジェクトを更新するか、すべての変更を盲目的に受け入れることがよくあります。 DTOは、サービスの使用方法と目的の操作を明示的に表します。
  • 切断シナリオ - あなたは、このようなメッセージブローカなど
  • DDDなどのメッセージングおよびメッセージングパターンを実装するための明示的なメッセージやのDTOを持つが、それより簡単になるだろう - 純粋なDDDは、ドメインオブジェクトは外部から不変であり、したがって、あなたがオフロードしなければならないことを要求しますこれを別のオブジェクト、典型的にはDTOに割り当てる。
3

DTOは、転送がキーワードであるデータ転送オブジェクトです。彼らはあなたが "軽量"(つまり、ビジネスロジックなし)なので、ワイヤを渡ってあなたのオブジェクトを渡し、潜在的に別の言語と通信したいときに最適です。

アプリケーションがWebサービスベースでない場合、DTOは本当にあなたに何かを買うつもりはない。

DTOを使用するかどうかを決めるには、アプリケーションのアーキテクチャに基づいている必要があります。

+0

意味があります - はい、問題の特定のアプリは高度に分散したアプリです。入力いただきありがとうございます。 – Aaron

+0

どのような意味で分散されていますか?リモーティングのようなテクノロジーを使用している場合は、通常はドメインオブジェクトをシリアル化して問題なく境界線に渡すことができます。いったん別のプラットフォームに移行し始めると、DTOは通常、作業を簡単にします。 – Bob

1

データは、ビジネスオブジェクトの構造に正確にマッピングされない場合があります。この場合、DTOを使用します。

例:データまたは投影のサブセットを渡す場合。

4

私はのDTOを使用するための2つの基本的なシナリオを考えることができます:あなたが不完全だと検証を失敗したデータからビジネス・オブジェクトを作成している

  • たとえば、ビジネスオブジェクトの作成場所からCSVファイルまたはExcelファイルを解析しています。これらのオブジェクトから直接データを使用してビジネスオブジェクトを作成すると、そのファイル内のデータにエラーが発生する可能性があるため、オブジェクト内でいくつかの検証ルールが失敗する可能性があります。また、最終的なビジネスオブジェクトには、構造が異なる傾向があります。不完全なデータのプレースホルダーを使用すると便利です。

  • 帯域幅を大量に使用するメディアでビジネスオブジェクトを転送しています。 Webサービスを使用している場合は、移送前にオブジェクトを単純化するためにDTOを使用する必要があります。そうしないと、CLRはすべてのデータをシリアル化しようとすると苦労します。

関連する問題