2011-01-23 4 views
0

フォームのコントロールをデータベースのデータにバインドしたいのですが、バインディングはコードビハインドで行われます。3層デザインの質問、フォームにバインドするデータ

3レイヤーのパターン、Entity Frameworkを使用するDALレイヤー、DALを使用してデータを取得するBLL、およびフォームを表示するフォームを使用したいと思います。私はからの3つのテキストボックスにバインドしたい価格

、カウント、名前:

はのは、3つの特性を持つ製品と呼ばれるエンティティオブジェクトがあるとしましょう。コードから

私は必要なエンティティオブジェクトを取得するために、DALのメソッドを呼び出しますBLLのメソッド呼び出しの後ろに...ここで

が問題で、フォーム上のデータをバインドするために、フォームはこれについて「知る」必要がありますがBLLによって返されたentityObject

DataAccessLayer.Product product = BusinessLogicLayer.GetProduct(someid); 
textbox1.text=product.name; 
textbox2.text=product.price; 
.... 

をしかし、これは3層のパターンを破る!!:

だから私はこれを行うことができます どのようになる?このデータを保持するだけの新しいオブジェクトを作成しますか?

答えて

2

私は通常、IRepositoryのようなオブジェクトを扱うビジネスオブジェクトとインターフェイスをドメインプロジェクトに分けています。私のDALはこのプロジェクトを参照できるので、私のWebプロジェクトもできます。

UPDATE

プロジェクト構造:

  • ドメインは - エンティティ、 インタフェース
  • DALが含まれている - ビジネスロジックが含まれている - は、インターフェースは、ドメイン
  • BLLを形成実装し、データアクセスロジックが含まれています、 DALとドメインを使用します。可能であれば が実装されています ドメインからのインターフェースだけでなく
  • ウェブは - 、ページが含まBLLとドメイン
+0

ドメインプロジェクトとは何ですか? Webサイト? – urker

+0

@urker、ちょうどコードアセンブリ – Vadim

+0

しかし、IRepositoryがDALドメインにある場合、Webサイトはそれについて知る必要があります。 IRepositoryがウェブサイトドメインにある場合、DALはそれについて知る必要があります。 – urker

1

インターフェイスで作業します。あなたのフォームはいくつかのIProductについて知っていますが、特定の実装について知る必要はありません。たとえば、NInjectを使用して、依存関係注入を行うことができます。

+0

だから、私はIproductインターフェイスを作成する必要があります.that Productエンティティはそれを実装し、フォームでは次のようにロードします:IProduct product = BusinessLogicLayer.GetProduct(someid);しかし、この場合はフォームからDALからインターフェースを参照する必要があります。いずれの方法でもこのリファレンスを取得します! – urker

+0

実際に私はあなたのBLにもIBusinessのようなインターフェースがあります。 BusinessLogicLayerはこのインターフェースを実装しています。依存関係注入を使用すると、IBusinessをBusLogLayerクラスと簡単に交換できます。それであなたの呼び出しはIProduct = MyRepositoryInterfaceになります。GetProduct()。 – Gidon

0

からエンティティ/インタフェースは、最も一般的な方法を使用しており、また、ベストプラクティスは、クライアント側のリポジトリを使用することです。エンティティをドメインオブジェクトに抽象化することができます。 AutoMapperのようなマッパーを使用して、サービスレイヤーによって返されるデータ転送オブジェクト(DTO)と、アプリケーションレイヤーによって使用されるドメインエンティティをマッピングできます。これをリポジトリの背後で抽象化することによって、アプリケーション層はサービス層について知る必要はなく、2つは独立して変化することができます。