8

n 層アプリケーションのレイヤーにデータを渡すにはどうすればよいでしょうか? 私は3つの異なる方法を計画しました。

A) ジェネリック .net オブジェクト ジェネリック データ テーブル、ハッシュテーブル、ジェネリック データセット、文字列、int など... 次に、データセットを使用して、UI レイヤーに送信されるビジネス オブジェクトを埋めます。

代替テキスト http://img11.imageshack.us/img11/460/generic.png

http://dabbleboard.com/draw?b=eiu165&i=26&c=54eef6f1ac01f03c85919518f4a24e798e57e133

Pro-追加のレイヤーは必要ありません Con-ビジネスレイヤーで一般的なデータセットとテーブルを操作する必要があります

B) 他のレイヤーが参照するエンティティ レイヤーを使用する。このレイヤーには、厳密に型指定されたデータセットまたはプレーン オールド C オブジェクトのいずれかが含まれます。オブジェクトはほとんどがコンテナ データで、ロジックはほとんどありません。これらは、UI レイヤーに送信されるオブジェクトと同じです。

代替テキスト http://img8.imageshack.us/img8/6454/entities.png

http://dabbleboard.com/draw?b=eiu165&i=6&c=d0c2b346894a96b12bd3867f630e474a2af098fa

すべてのレイヤーで同じクラスを使用するプロ作業 すべてのレイヤー entities.dllへの参照を追加する

C) DataAccess Layer で定義されたデータ転送オブジェクト (コンテナ オブジェクトのみ) を使用します。次に、これらのオブジェクトを使用して、UI レイヤーに送信されるビジネス オブジェクトを埋めます。

代替テキスト http://img43.imageshack.us/img43/1236/transferp.png

http://dabbleboard.com/draw?b=eiu165&i=27&c=f886efa3f9d5eb4b45ddb02361c79cdcdaec0a9b

プロ- ビジネス層は一般的なクラスで 動作する必要はありません 2 種類のオブジェクトを扱う場合、転送オブジェクトでビジネス オブジェクトをハイドレートする必要があります

私たちは職場で議論を行い、コミュニティがどう考えているかを知りたがっていました。ダブルボードへのリンクも追加しました。編集ではなくコピーして作成してください。
ありがとう

4

4 に答える 4

5

階層化されたアプローチを使用している場合、つまり、すべてのレイヤーが (本質的に) 同じプロセス空間で実行されているため、マーシャリング/シリアル化がない場合は、アプローチ B を使用します。あなたのプログラムの依存し、それに結合します。

ただし、タイトルが示唆するように階層化されたアプローチを使用している場合、つまりプロセスやネットワークの境界を越えている場合は、アプローチ C を使用することをお勧めします。インスタンスを実際に渡しているわけではありません。コピーを渡すため、MVC アプローチなどの観察可能なオプションなど、同じオブジェクトに結合することで得られる利点はいずれにせよ失われます。すべての層で同じクラスを使用しようとするよりも、すべての階層レベルでデータ API を定義する方が適切です。

于 2009-05-27T19:16:35.553 に答える
1

素晴らしい質問です。いつものように、答えは「場合による」です。

アプリケーションのタイプ、および転送オブジェクト (つまり、データベース エンティティに対応する機能を縮小したビジネス オブジェクト) ではなく、ビジネス オブジェクト (エンティティ) が本当に必要かどうか。

従来、純粋にパフォーマンス上の理由から、常に汎用データ セット (またはデータ テーブル) が必要であると主張していました。より大きなセットを操作、表示、または操作する必要があるときはいつでも、多数のビジネス オブジェクトをインスタンス化する従来の厳密な OO の方法は失敗しました。

しかし、Linq to SQL を使い始めてから、私のパラダイムは変わりました。ビジネス オブジェクト、転送オブジェクト、一般的なデータセットなど、Linq モデルはあらゆるものになる可能性があるため、これはまったく必要ありません。これが非常に大規模なアプリケーションでどの程度うまく機能するか、またフロントエンド コードを Linq モデルから分離する必要があるかどうかについては、まだ調査していません。私はそれについて同僚と議論しましたが、どちらにしても答えは見つかりませんでした.

于 2009-05-27T19:11:37.560 に答える
0

私はオプション C が好きですが、次の 2 つの理由で一時停止します。

  1. 私はあまりにも多くの場所でプロパティが何であるかについての知識を広めなければなりません.
  2. DTO はシリアライズ可能でなければなりません。これはひどいことではありませんが、考慮すべき点です。
于 2009-05-27T19:08:09.923 に答える
0

3 つのレイヤーすべてが同じアプリ内に存在すると想定しています。少なくともJavaでは、データアクセスにHibernateを使用し、すべてのレイヤーでこれらのデータBeanを使用しました。(オプション B) エンティティをレイヤーで再利用できることは理にかなっています。

于 2009-05-27T19:10:39.760 に答える