2017-09-11 5 views
1

フルファットDtosを返したいですか?つまり、基本親エンティティ情報、それはIDと名前、子エンティティの集合は子dtosの集合に変換されます。またはすべてを取り除き、親エンティティのIDだけを返しますか?完全な太いまたはスキニーのDTOオブジェクト?

不足している詳細を記入するために、web-apiに多くのコールが戻ってきますが、エンティティに多くの子、グランドチャイルド、等の関係。

特定のレベルでシリアル化を停止するための半スキミングオプションがありますか?

追加のコンテキストを追加する:内部使用のためにサードパーティのAPIをラッピングしています。第三者は約18,000のエンティティ、約18MBを返却するための「スキニー」アプローチを使用しています。

これが何らかのIDのコレクションであるためには、少なくともいくつかのコンテキストを追加する必要があります。 IdとNameのエンティティは簡単に含めることができますが、関連フィールドに子関係がある場合は、基礎となるデータベース設計によって面白い循環関係が得られます。

+0

これは現在の形。銀色の弾丸はありません。答えは「それは依存する」です。あなたが必要としているものと実行可能なオプションが分かっているだけです。 – CodeCaster

答えて

3

私はいつも "全脂肪"あなたがそれをダビングしたように、DTOアプローチ。パフォーマンスは機能であり、不必要なネットワーク遅延を追加するよりもパフォーマンスを低下させる良い方法はありません。

サーバーとの往復の回数を減らすという利点のために、ひどくリソースの詰まったマシンを扱っているのでなければ、フル・ファットになるよりも、

多くの情報はありませんでしたが、ここではDBテーブルを使用していると思いますか?もしそうなら、私は個々のDBレコードの純粋な表現(明らかに機密フィールドを省略)として「エンティティ」を公開することを好む。それを公開してナビゲートするためのRESTful APIを作成します。

EDIT:私は「全脂肪」によって何を意味するかについていくつかのコードを詳述すると(注: 特定の余分な詳細は、冗長性を減らすために省略されています)。

例SQLセットアップ:

create table dbo.User (
    Id int identity primary key, 
    Name nvarchar(50) 
); 

create table dbo.Post (
    Id int identity primary key, 
    UserId int not null foreign key references dbo.User(Id), 
    Title nvarchar(50), 
    Body nvarchar(max) 
); 

例CLRオブジェクト:

public sealed class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public IEnumerable<Post> Posts { get; set; } 
} 

public sealed class Post 
{ 
    public int Id { get; set; } 
    public int UserId { get; set; } 
    public string Title { get; set; } 
    public string Body { get; set; } 

    public User User { get; set; } 
} 

上記セットアップ、オブジェクトを公開する方法の例を考えるとRESTfulに希望次のようになります。

/api/users   /*users collection*/ 
/api/users/1   /*user resource*/ 
/api/users/1/posts /*user resource with posts sub-collection*/ 

/api/posts   /*posts collection*/ 
/api/posts/1?user=1|0 /*post resource with/without User*/ 
0

選択肢は、ソリューションを適用する必要があるコンテキストに完全に依存します。

通常は2つをミックスします。ウェブショップなどの「マスターディテール」タイプのビューがあり、ユーザーが製品の名前と価格だけを表示するリストに製品を表示する必要がある場合は、「スキニー」バージョンを選択します。その後、ユーザーは商品をクリックして詳細ページを見ることができます。私は 'フル・ファット'バージョンを送ります。

しかし、各製品に関連するカテゴリがある場合は、「詳細」製品dtoのcategoryidとおそらくカテゴリの名前のみを送信します。ユーザーがカテゴリをクリックしてカテゴリの詳細や他の製品を表示すると、残りの部分を送信します。

2

回答は「フル・ファット」のDtoが必要ですか?

必要なデータのみを返します。例えば、顧客注文の構造については のみcustomer.Idとを使用する予定の方法については

  • customer.Nameあなただけ{ Id: 1, Name: "One" }
  • あなたはより多くの情報
    { Id: 1, Name: "One", Street: "Street 12", City: "City" }
  • を返します。より多くのお客様の情報を必要とする方法のために返すことができますより複雑なデータが必要なAPIを作成する より複雑なデータを返す

最初からジェネリックではなく、アプリケーションに必要な具体的なAPIメソッドを開発してから、全体的な画像とリファクタリングの方法をより一般的なものにして、異なるトレードオフで再生してください。

関連する問題