5

私は最初のSPAを構築していますが、エンティティごとにDTOを構築するまでは行っていますが、今度はbreezeを見つけました。変更をシリアル化して最小限のパッケージにして、追加/等。BreezeはシングルページアプリケーションでDTOの必要性を排除していますか?

私がDTOを構築した理由は、データを「平坦化」してデータの量を制限することですが、Breezeが処理する場合でもこのオーバーヘッドが必要かどうかは疑問です。

+0

グレート質問!フラット化のためのDTOの必要はありません。 –

+0

機密データ(HR表の給与情報など)を保護したい場合は、DTOを使用すると便利です。 – mikekidder

+0

私にとって、DTOを使用する主な理由は、DALをプレゼンテーション層から切り離すことです。 Breeze/EFを使用すると、すぐに機能するだけでエンティティをクライアントに直接送信することが非常に魅力的です。しかし、デカップリングがなければ、データベースの変更には、クライアントサイドのJavaScriptのコードリファクタリングが必要になることがあります。恐ろしい。 –

答えて

5

DTOの理由があります。 「データの平坦化」はではなく、のいずれかです。 「どれくらいのデータをワイヤに置いているかを制限すること」もありません。

Breezeはオブジェクトグラフでうまく機能します。顧客に対して100件の注文を送信するとします。それぞれの注文DTOで顧客名を繰り返すことは望ましくありません。 Breezeを使用して顧客の注文を照会し(「展開」を使用)、得意先とその注文のコピーを1部取得します。一方

 
var query = new breeze.EntityQuery.from('Customers') 
      .where('Id', 'eq', 42) 
      .expand('orders'); 

、あなただけの顧客名の一覧が必要な場合は、「投影」を使用:それはできませんので、何かを構築するために時折、サーバー側DTOを使用し

 
var query = new breeze.EntityQuery.from('Customers') // all customers 
      .select('id, companyName'); // project into an anonymous 2-property object 

をクライアントから簡単に作成することができます(たとえば、顧客総額と受注総額)。

要点は、ニーズに合わせてDTO、投影、エンティティクエリを混在させることができるということです。あなたはすべての一方的なやり方をする必要はありません(私の意見では)。

+0

偉大な答え。 Breezeは簡単に予測を行い、ワイヤ上のデータを制限できます。実際、OData対応のjavascriptクライアントでもこれを行うことができます。 DTOは理由があれば必要ないと思います。 –

+0

ありがとうワード! sss – JakeP

1

現在、私たちが書いたDTOとDTOマッピングコード(サーバーとクライアントのサイドコード)の多くを取り除くために、KnockoutからAngularとBreezeへの変更を評価しています。私たちがしたのは、DAOを公開するのではなく、すべてのエンティティのDTOを作成することでした。最終的に何が起きるかは、多くの場合(すべてではない)データベースオブジェクトに90%類似しているクラスがあったことです。これは、私たちのケースではDTOが意味をなさないという結論に至り、オーバーヘッドが無駄になってしまったので、これをより良い方法で取り除く必要があります。したがって、リファクタリングラウンドを開始する必要があります:-)

ここで私たちは2人のエキスパート(@Johnと@Ward)を1か所に配置していますので、質問に答えて、今まで私が完全に答えていないJohnとWardは、DTOがまだ必要なのかどうかという問題の重要な側面だと思うので、これを明確にすることができます。

多くのDTOとDTOマッピングコードを避けることは大きな助けになると思われます。そして、私は、風と一緒にワイヤーを少なくするためのDTOの使用法は意味をなさないと完全に同意します。クライアント側のクエリで上で説明したように、それは完全に風によって処理されます。これは私が完全に確認して意味をなすことができるものです。また、私たちが行ったように多くの異なるDTOクラスを作成することは最良の方法ではありません。 Breezeはコードを大幅に減らしてこれをはるかに改善します。

懸念の分離にDTOとDTOマッピングコードを使用するには、私はまだ良いアイデアと原則だと考えていますが、多くの場合、必要のないオーバーヘッドも多くあります。したがって、breezeを利用するには、DTOを作成してクライアント側でメタデータを作成/生成することができますが、これは基本的なbreezeのアイデアではありません。この方法で使用することはできますが、DAOにとどまるほど、書くコードが少なくて済み、プロジェクトが速くなります。しかしそれにもかかわらず、微風はあなたにこれを許可します。フレームワークはDTOでも動作します。両方の組み合わせ(DAOとDTOの公開)がおそらく最善のアプローチです。

しかし、その後のDTOを使用する場合?

  • セキュリティ
  • 複雑なロジック(計算)か、しないか、またはできないいけない、あまりにも多くの複雑さの (セキュリティ)クライアント側で公開するので、あなたは、単純なCRUDメソッドを使用することができません。

私は実際には100%確実ではないので、私はここに書いており、2人の専門家に尋ねたいと思います。私たちはサーバー側でEFを使用していますが、おそらく最も良いアイデアは、セキュリティのためにサーバー側で予測を使用することです。しかし、それを行う方法?

私はのDTOがまだ必要な場合は、質問に答えることができることのために答えることが最も重要だと思うので、私はこの質問を提起。

私たちは(私たちの評価のデモで)EFのための次のコードで終了しました:

private IQueryable<News> RestrictFields(IQueryable<News> query) 
    { 
     return query 
      .ToList() // This seemd to be needed, otherwhise I cannot use new News() 
      .Select(t => new News() 
       { 
        Id = t.Id, 
        Text = t.Text, 
        Title = t.Title, 
        Date = t.Date 
       }) 
      .AsQueryable(); 
    } 

ですから、上記を参照できるように、我々はEFクエリを持っています。だから私たちが最初に試みたのは、新しいNews()を使った投影でした。これはうまくいきませんでした。なぜなら、EFでは、投影で同じDAOクラスを使用することはできません。DTOオブジェクトまたは匿名のものだけを使用できます。 ToList()とAsQueryable()の回避策を使用しました。しかし、これは正しいとは思わないし、おそらくクライアントからのクエリパラメータがデータベースに送られることはなく、おそらく「展開する」のようにこのために何らかの作業が行われない可能性があります。

だから、そう最終的に本当にのDTOの必要性を取り除くために、セキュリティ上の理由により、サーバー側での投影を行うための最善の方法は何ですか? @ジョン:私はあなたが言うあなたのポストを見て、あなたは、(角とブリーズ)トレーニングクラスのためにあなたのデモプロジェクトにスピーカーの突起を使用しますが、私はこれが実装されている場所を見つけることができませんcound。

ここで私は本当に立ち往生していますと、これは私のためのDTOがまだ必要かされていないかどうかを知るために、それはその後、ブリーズと完全に一緒に作業することができますどのようにミッシングリンクです。

私は私の答えは少しあなたの質問に答えると、さらに私はそれが風の利用におけるいくつかの非常に重要なリンクでとのDTOがまだ必要であるならば、あなたにもジェイクを提供願ってい役立ちます願っています。

敬具、

クリス

関連する問題