30

ドメイン オブジェクトを渡す代わりに DTO を使用することを検討しています。ここや他の場所でいくつかの投稿を読みましたが、これを行うにはいくつかのアプローチがあることを理解しています。

全部で約 10 個のドメイン クラスしかなく、ビュー (WPF フロント エンド) で使用するためにドメイン オブジェクトではなく DTO を使用したい場合、推奨されるアプローチは何ですか。私の状況では、オートマッパーなどのツールを使用するのはやり過ぎだと思います。そこで、ドメイン タイプを DTO タイプに変換するメソッドを持つカスタム マッパー クラスを作成することを考えています。

これを行うための最良の方法は何ですか?これを開始するためのサンプルはありますか?

2 番目の質問: DTO を作成するメソッドを作成する場合、特にドメイン タイプが他のドメイン オブジェクトへの参照を持っている場合、すべてのデータの設定をどのように処理すればよいですか? ドメイン クラスのこれらの参照型にマッピングするために、DTO に同等のプロパティを記述しますか? 2 番目の質問を適切な言葉で表現していないかどうか尋ねてください。しかし、私が尋ねようとしていることを理解していると思います。

3 番目の質問: DTO を作成する場合、それぞれが特定のビューの要件を満たすために使用できるように、特定のドメイン モデルの部分的なデータを含む複数の DTO を作成する必要がありますか、それとも DTO にすべてのデータが含まれている必要があります。対応するモデル クラスで。

4

7 に答える 7

13

ここで DTO に関するいくつかの投稿を読んでいますが、多くの人がそれらを私が ViewModel と見なすものと同一視しているようです。DTO は、まさにデータ転送オブジェクトです。これは、ネットワークを介して渡されるものです。だから私はウェブサイトとサービスを持っています.サービスだけが実際のドメイン/エンティティオブジェクトにアクセスでき、DTOを返します. これらは 1:1 でマッピングされますが、DTO が別のサービス呼び出し、データベース クエリ、構成の読み取りなどから読み込まれる可能性があることを考慮してください。

その後、Web サイトはこれらの DTO を受け取り、それらを ViewModel に追加するか、ViewModel に変換することができます。その ViewModel には、さまざまな種類の DTO が含まれている場合があります。簡単な例はタスク マネージャーです。ViewModel には、編集中のタスク オブジェクトと、タスクを割り当てることができる Dto.User オブジェクトのグループの両方が含まれています。

DTO を返すサービスは、Web サイトとタブレットまたは電話アプリケーションの両方で使用される可能性があることに注意してください。これらのアプリケーションは、そのディスプレイを利用するために異なるビューを持つため、ViewModel は異なりますが、DTO は同じままです。

とにかくこういう議論が大好きなので、どなたか感想を聞かせてください。

マット

于 2011-08-25T18:21:07.013 に答える
4

私はプロジェクトでDTOを使用しています。私は、特定のビューに必要なデータを表示するためだけに DTO を作成する傾向があります。ビューに表示されているすべてのデータをデータ アクセス クラスでフェッチします。たとえば、Client オブジェクトを参照する Order オブジェクトがあるとします。

public class Client{
    public int Id{get;set;}
    public string Name{get;set;}
}

public class Order{
    public int OrderID{get;set;}
    public Client client{get;set;}
    public double Total{get;set;}
    public IEnumerable<OrderLine> lines {get;set;}
}

次に、 OrderListDTO に次のようなものがあります。

public class OrderListDTO{
    public int OrderId{get;set;}
    public string ClientName{get;set;}
    ...
 }

ビューに表示したいフィールドはどれですか。これらすべてのフィールドをデータベース アクセス コードでフェッチするので、ビューまたはコントローラー コードでエンティティの関連付けを気にする必要はありません。

于 2009-09-06T14:26:45.323 に答える
0

ドメインモデルオブジェクトには、元のデータベースまたはストアのIDに対応する可能性のある主キーIDがあると想定します。

上記が当てはまる場合、DTOは、外部キーIDの形式で、ドメインオブジェクトと同様に他のDTOを参照する型を克服します。したがって、ドメインオブジェクトのOrderLine.OrderHeader関係は、DTOのOrderLine.OrderHeaderIdになります。

お役に立てば幸いです。

ビューでリッチドメインオブジェクトの代わりにDTOを使用することを選択した理由を尋ねることができますか?

于 2009-09-06T13:55:59.123 に答える