データセットは、n層(多層)アーキテクチャのどこに配置する必要がありますか?
-
10-07-2019 - |
質問
現在、データセットをデータ層またはビジネス層に入れるかどうかについて議論しています。
私の友人は、すべてのADO.NETコンポーネントがデータ層に配置されるべきだと考えています。私にとっては、これは以下の理由で正しいとは思えません:
- ファットデータレイヤークライアントを作成する場合、たとえばすべてを別のデータソースに移行することははるかに困難になります。
- ビジネスレイヤロジックをスキップしない限り、コントロールをバインドできません。
データセットとデータテーブルはすべてのデータプロバイダーに一般的であるため、ビジネスロジックに含める必要があると思います。データ層には、適切なプロバイダーのオブジェクト(Connection、DataAdapters、Transactions、DataReadersなど)をインスタンス化するためのProvider Factoryが必要です。私にとって、これは次の理由で進むべき方法です。
- 別のデータレイヤーへの移行は簡単です。
- コントロールをリッチビジネスオブジェクトにバインドできます
n層の第一人者が道を切り開くのに役立つか?よろしくお願いします
解決
データレイヤーからビジネスレイヤーにデータセット、データテーブル、データ行、およびデータリーダーを返します。
その理由は、これらのタイプはdb-flavor固有ではないということです。 mysql、access、sql server、oracle、またはデータセットがデータセットであるものを使用しているため、ルートレベルのデータレイヤーから戻ることができます。
ビジネスレイヤーは、この生データを取得して、強く型付けされたビジネスオブジェクトに変換します—必要なビジネスルールを適用する—プレゼンテーション層に渡す。
編集:コードを見てみると、完全なデータセットをあまり使用していません。主にデータテーブルとデータリーダーです。
他のヒント
私の意見では、DataSetをまったく使用しないでください。型付きDataSetを使用しないでください。これらは、LINQの前に作成された古い構成体です。古代史をすぐにスキップして、現在の時制に入ります:LINQ to EntitiesおよびEntity Framework(EF)を使用します。 2つは密接に関連していますが、同じではありません。
サービスの境界を越えてEFエンティティを公開しないでください。残念ながら、Microsoftはエンティティをシリアル化するときに実装の詳細を公開することを選択しました。それ以外は、EFを使用して、DataSetを使用した場合よりもずっと楽しい時間を過ごしてください。
まあ、データアクセスの分離は新しいものではありません。15年前(はい、15年前!)に行っています。
私は多くの場所で働いており、多くの孤立したデータレイヤーを見ました。
しかし、私はこれまでにない! -データソースが置き換えられるのを見ました!
はい、私はそれを2回見ました:そして2回、oudatedデータレイヤーとすべてのトッピングソフトウェアを置き換えます...
私の答えは非常に簡単です:シェルフソフトウェアで作業しているのでなければ、データレイヤーを必要なだけ分離でき、何もしないで処理できます。
誰もSQL ServerやOracleを変更するためだけに変更することはないので。そして、誰かがそれをする日のために、彼らは彼らのソフトウェアも書き直すか、彼らが購入している製品が彼らが残している製品と互換性があることを示すことになるので、何もしません。
私の本では、どのデータ層も愚かです。
同意しない場合は、あなたの人生でこのレイヤーが$$$を誰かに保存するときに教えてください...
一般的なアプローチは、ビジネスロジックレイヤー/ドメインで集約ルート(顧客など)リポジトリインターフェースを公開し、データアクセスレイヤー/インフラストラクチャで具体的なリポジトリを実装することです。
DataSetの基本的な問題は、その構造がデータベーススキーマの正確なミラーであるということです。
DataSetを実際のページレンダリングコードに公開すると、データベーススキーマ(製品の最終的なバックエンド)がプレゼンテーションレイヤーに効果的に公開されます。明らかな問題が発生する可能性があります。後の段階で、基礎となるデータスキーマを再構築します。また、設計のために、システム内の他のすべてのレイヤーに変更を適用する必要があります。これは、本来あるべきときに使用されないカプセル化の典型的な例です。
DataSetを使用する場合は、DataSetをデータアクセスレイヤーに埋め、ビジネスオブジェクトの概念セットをプレゼンテーションレイヤーに公開します。公開するビジネスオブジェクトのセットは、優れたオブジェクト指向のプリンシパルに従って設計する必要があります。これは、優れたリレーショナルデータベースの設計プリンシパルとはまったく異なります。
dataSetをまったく使用しないことに同意する必要があります。そこで作業したアプリケーションの1つは、データ層とアプリケーション層の両方のデータセットでした。 DataLayer DataSetsは、アプリケーションレイヤデータセットが情報を非正規化して、フロントエンドでより使いやすくするデータベースと一致しました。