2

DTO を実装する最良の方法は何ですか?

私の理解では、それらはオブジェクト間でデータを転送する 1 つの方法です。たとえば、ASP.Net アプリでは、DTO を使用してコード ビハインドからビジネス ロジック レイヤー コンポーネントにデータを送信できます。

データをメソッド パラメーターとして送信するだけのような他のオプションはどうでしょうか。(送信するデータが少ない場合、これは最も簡単でしょうか?)

データを保持するだけで、他のオブジェクトから参照できる静的クラス (一種のグローバル アセンブリ データ ストレージ クラス) はどうでしょうか。(これはカプセル化を壊しすぎますか?)

すべての転送に使用される単一の汎用 DTO はどうですか? 使用するのは少し面倒かもしれませんが、操作に必要なクラスの数を減らします (オブジェクトの乱雑さを減らします)。

あなたの考えを共有してくれてありがとう。

4

6 に答える 6

3

シンプルに保ち、1 つの DTO クラスを 1 つの db テーブルにマップします。軽量なので、有線を含め、どこにでも送信できます。

于 2009-02-04T19:27:40.643 に答える
3

私はそれがシンプルであることを望みます。DTO はシステムのネットワーク分散層が原因で発生しましたが、ドメイン オブジェクトがビュー レイヤーに返されると、問題が発生する可能性があります。それらのいくつかを次に示します。

1. ドメイン オブジェクトをビュー レイヤーに公開することにより、ビューはドメイン オブジェクトの構造を認識するようになり、ビューは関連するオブジェクトがどのように利用できるかについていくつかの仮定を立てることができます。たとえば、ドメイン オブジェクト「Person」が「バインド」されているビューに返され、他のビューで Person の「Address」がバインドされる場合、アプリケーション層は次のようなセマンティックを使用する傾向があります。その時点でアドレスドメインオブジェクトがロードされていない可能性があるため、 person.getAddresse() は失敗します。基本的に、ドメイン オブジェクトがビュー レイヤーで使用できるようになると、ビューはデータがどのように使用可能になるかについて常に仮定を立てることができます。

2.) ドメイン オブジェクトがビューにバインドされている場合 (シック クライアントではさらにそうです)、ビュー中心のロジックがこれらのオブジェクト内に忍び込み、オブジェクトを論理的に破損させる傾向が常にあります。

基本的に私の経験から、ドメイン オブジェクトをビューで使用できるようにするとアーキテクチャ上の問題が発生することがわかりましたが、DTO を使用するとアセンブラー (ドメイン オブジェクトへの DTO とその逆) の作成に関して追加の作業が発生するため、DTO の使用にも問題があります。患者ドメイン オブジェクト、患者 DTO、およびおそらくビューにバインドされた患者 Bean などの類似オブジェクト。

特にシック クライアント システムでは、明らかにこれに対する正しい答えはありません。

DTO の決まり文句に対するこの短い完全ではないが真の回答をhttp://www.theserverside.com/discussions/thread.tss?thread_id=32389#160505から借りました。

于 2010-07-21T09:37:56.660 に答える
2

DataSet/DataTableを「すべてを統治する1つのDTO」として使用することはかなり一般的だと思います。それらをデータベースからロードし、値を永続化するのは簡単で、簡単にシリアル化できます。

間違いなく使いにくいと思います。それらはすべての配管を提供しますが、それらに対するプログラミングは苦痛です(多くのキャスト、nullチェック、マジックストリングなど)。それらを使って作業することをもう少し「自然」にするための優れた拡張メソッドのセットを見るのは興味深いでしょう。

于 2009-02-04T19:41:47.853 に答える
1

DTO は、オブジェクト間ではなく、ネットワーク経由でデータを送信するために使用されます。この投稿をチェックしてください: POCO vs DTO

于 2009-05-17T23:23:00.963 に答える
0

すべての有用なアイデアをありがとう...

要約+これに関する私の見解:

-移動するデータの量が少なく、移動する場所が多すぎない場合は、通常のパラメーターで十分な場合があります

-移動先のデータやオブジェクトが多い場合は、特別に作成したオブジェクト(DTOオブジェクト)が最も簡単な場合があります。

-さまざまなオブジェクトから(渡されるのではなく)参照できるグローバルデータオブジェクトは眉をひそめているように見えます...しかし、特定のサブシステム内にその場所がない場合があるのではないでしょうか。これは、渡されるデータの量を減らす1つの方法です。それは「適切なカプセル化」の限界を押し広げますが、特定のレイヤー内の特定のインスタンスでは、おそらくクラスの特定のアセンブリに単純さを追加する可能性があります。したがって、クラスレベルのカプセル化は失われますが、アセンブリレベルのカプセル化は維持される可能性があります。

于 2009-02-05T18:28:14.147 に答える