5

BLL と DAL の間の非常に厳密な境界を持つ小さなアプリを作成しようとしていますが、レイヤー間でデータ (ドメイン転送オブジェクト) を渡す最善の方法は何だろうと思っています。

BLL と DAL の両方からアクセスされるドメイン レベル (クラス ライブラリ) にいくつかのクラスを実装しました。これらのクラスは、基本的にプロパティ/データ メンバーのみを含み、現在 DAL データを反映しています。元:

class CustomerData
{
  // some data fields
}

次に、BLL にいくつかのクラスを次のように実装しました。

class Customer : CustomerData
{
  // Some methods
}

私の DAL では、Linq-to-Sql を介してデータベースから顧客レコードを取得します。次に、次の方法で linq オブジェクトを Domain オブジェクトにマップします。

CustomerData.field = LinqObject.field
// Etc

したがって、私の考えでは、要求されたときに DAL から BLL への CustomerData インスタンスになりました (そして、Customer インスタンスを UI に渡す必要があります)。

私の BLL では、このように CustomerData インスタンスを受け取りますが、今はそれから Customer を作成したいと考えています。

質問:

  1. BLL で Customer インスタンスを作成し、もう一度すべてのフィールド メンバーをコピーする必要がありますか?
    顧客 c = 新規顧客。c.field = CustomerData.field;
  2. フィールド コピーの手順を実行せずに、CustomerData から Customer を作成するにはどうすればよいですか?
  3. ではなく、合成を使用する必要がありますか?
    class Customer { CustomerData データ; }
  4. 現在のレイアウトでこれを行うためのより効果的な方法 (コーディングを減らすなど) はありますか?
  5. これを行うためのより良い方法はありますか?
  6. 一般的なコメントはありますか?

ありがとう !

4

4 に答える 4

8

一般に、DTO はレイヤー固有ではなく、DAL によって作成/消費され、BLL によって処理され、UI によって消費/作成されると考えています。

通常、各レイヤーは VS ソリューション フォルダー内の個別のプロジェクトであるため、DTO は各レイヤーによって参照される別のプロジェクトです。

このようにして、UI に存在する必要があるが他のレイヤーには存在しないフィールドがある場合、DTO を継承できます。

于 2011-01-14T12:26:51.327 に答える
2

私の観点からのいくつかのメモがここに来ます、私はオラクルではありませんが、うまくいけばそれはいくつかの助けになるでしょう:)

ここには「モデル」が多すぎるように感じます。異なる表現間でデータをコピーするためだけに、混乱を招き、多くのコードが必要になる可能性があります。また、コードが多いということは、バグが増えることを意味します。次に、データクラスとビジネスクラスの間の継承により、ビジネスクラスを定義する際の制限が生じると思います。いくつかのデータ クラスで構成されるビジネス クラスを作成する場合はどうでしょうか。むしろインターフェースやコンポジションを使うべきだと思います。

通常、私はビジネス ドメインを反映する 1 つの概念モデルだけを使用します。Dead Rabit が指摘しているように、このモデルはデータ層とビジネス層の両方で使用され、場合によってはプレゼンテーション層 (小さなアプリの場合) でさえ使用されます。永続性のために、EF 4 などの O/RM を使用します。

大規模なプロジェクト、特に分散シナリオでは、UI レイヤーにカスタム DTO を使用します。これらのクラスは UI のニーズを反映しており、概念モデルのエンティティとは大きく異なる可能性があります。

個人的には、Entity Framework 4 は、この構造に従ってアプリを構築する際に非常に役立つと思います。プロジェクトの初期段階にあり、.NET 4 を使用している場合は、試してみるとよいでしょうか?

  1. はい、おそらく必要です。
  2. 組成物を使用
  3. はい、コンポジションを使用します
  4. たとえば、Entity Framework 4 を使用します。
  5. (-"-)
  6. 上記を参照
于 2011-01-14T13:08:02.350 に答える
1

DTO に複数のレイヤーが必要な場合は、AutoMapperを使用して、1 行のコードでレイヤーを別のレイヤーに変換できます (DTO で同じ規則を使用することにより)。

CustomerData customerData = Mapper.Map<LinqObject, CustomerData>(linqObjectInstance);

また、PresentationModel パターンも参照してください: http://martinfowler.com/eaaDev/PresentationModel.html

このようにしたい場合は、MVVM (Model-View-ViewModel) をグーグルで検索することもできます。

于 2011-01-14T13:58:16.837 に答える
0

DTO を完全には使用していません。Customerクラスで、CustomerDataUI に直接戻ります。

Customerから継承する必要はありませんCustomerData

編集: CustomerData は DTO であるため、ここでは単語を完全に使用しました。したがって、Customer を返す代わりに、次の図に示すように、DTO として CustomerData を返します。

1 つの提案として、リポジトリ パターンを使用して BLL と DAL を分離する必要があります。

DTO1]

于 2011-01-14T13:00:18.347 に答える