2009-03-03 7 views
1

私は、自分のウェブサイトをstackoverflowのように始めました。契約の開発者なので、私は多くの場所であったし、この結果を達成するための多くの異なる方法を参照してください、私は行くよ方法は..ですn-Tierアーキテクチャーのフィードバックが必要

プレゼンテーション(ウェブ)

ビジネス・レイヤー(昔ながらのエンティティましたクラスとBL層)ストアドプロシージャを経由してSQL Serverへ

データ・レイヤー(DAクラス)

私の質問は、主にビジネスレイヤに関するものです。今私はEntity名前空間とBusinessLogic名前空間を持っています。

BLには、DAとエンティティへの参照があります。これビジネスロジック - エンティティは、私は本当にBL内で発生するエンティティにデータを回すのすべての私のチャーニングをしたい

(DAは、BLまたはエンティティの「気付かない」である)DA への参照をしています。しかし、必要に応じてEntityがBLにアクセスできるようにして、EntityのDLへの参照を削除したいと思っています。

そう...

されていますが、彼らは一緒に仕事ができるように、同じ名前空間内BLとエンティティオブジェクトを持っている「間違った」のですか?

基本的に、私は従業員(古典的な例、えっ?)のようなエンティティオブジェクトを持っており、従業員は、この従業員に報告し、他のEmployeeオブジェクトのハッシュテーブルを返します

public Hashtable[] SubordinateEmployees 

性質を持っていしようとしています。しかし、私はそれが必要になるまでロードしたくありません。ほとんどの従業員にとって、プロパティは決してアクセスされませんが、それが行われると、DAを呼び出すBLへの呼び出しで自動的にロードされます。

質問には意味がありますか?

もしそうなら、私の解決策はありますか?

ありがとうございます!

答えて

2

あなたの例が示すような状況に対処する通常の方法は、ファサードです。下位の従業員をEmployeeオブジェクトから取得しようとするのではなく、ビジネスロジックを呼び出して取得します。

あなたは部下への単一のアクセスポイントを持って、そして一つだけ(BL)データ層にアクセスすると、エンティティを作成するがある方法
hashtable = BL.GetSubordinateEmployees(supervisor); 

+0

私が懸念しているのは、それらをまとめて1つのオブジェクトにまとめたものです。これにより、必要に応じて再帰などが可能になります。組織図を上下にナビゲートするのと同じように。それ以外の場合は、2つのオブジェクトを維持するか、コードを両方ともフェッチして、ハッシュテーブルを書き込み可能な小道具に格納する必要があります。 – klkitchens

+0

あなたはそのようにすることができますが、再帰がより高い結合度をもたらす利便性を交換することになります。 UIをBLのみに依存させる代わりに、BLの役割を侵害するEntityオブジェクトがあります。将来的には物事を変えるのが難しくなります。それはトレードオフです。 – Welbog

+0

最終的にはあなた次第ですが、可能な限り多くの場合、カップリングを避けたいと思っている時間は大部分です。 – Welbog

2

私はあなたが(などのSQL Server、MySQLの、フラットxmlファイル、)あなたのデータへのアクセスを持っているこの

について考えるためのより良い方法を示すことができるなら、私は見てみましょう、このすべてが離れて何も抽象化されなければなりませんデータにどのようにレイヤー違反があるかが分かっている場合には、アプリケーションがデータをどのように取得しているかを気にしてください。 DAL線量が他に何か違う場合は、データを取得します。違反があるとします。次に、ビジネスレイヤーが使用するIDALのようなデータアクセスインターフェースを実装します。これは、レイヤーを分離することによってコードをテスト可能にするために非常に重要です。

あなたのデータエンティティは、DAL名前空間に置くことも、自分自身に与えることもできます。自分自身に力の分離を与えます。データエンティティはダムオブジェクトであり、ロジックをほとんどまたはまったく含まず、自分自身とそのデータのみを認識します。ビジネスロジック、データアクセスのローカル、またはUIロジックは含まれません。あなたがレイヤー違反を持っているならば。データエンティティの唯一の機能は、データを保持し、あるレイヤーから次のレイヤーに渡すことです。

Bizレイヤは、私たちが話したIDALのようなデータアクセスインターフェイスを実装する前に、ファクトリ、IOCコンテナ、またはそれ以外のすべての具体的な型には失敗しますが、テスト用に変更できるようにセッタープロパティを追加します。 Biz Layer Onlyはビジネスロジックを処理します。データがどこから来たのか、どこに行くのかを知らない、気にしません。ビジネスルールに従うようにデータを操作するだけです。これには日付の検証、フィルタリングが含まれますどのデータが必要なのかをDALに伝えて、DALに入手方法を理解させる)。基本的にBIZは、UI関連またはデータ検索関連でないすべてのロジックを処理します。 DALのように、Bizは同じ理由でInterfaceを実装する必要があります。

UIレイヤBizレイヤにアクセスするのと同じ理由で、BizレイヤがDALにアクセスするのと同じ方法でBizレイヤにアクセスします。すべてのUIレイヤが気にするのは、データの表示とユーザーからのデータの取得です。 IUレイヤーは、データエンティティにデータを入力するために必要なデータ検証を除いて、ビジネスルールについて何も知ってはいけません。

このアーキテクチャの利点は、テストを容易にし、柔軟性を持たせ、保守しやすくすることです。今日はWebサイトを構築していますが、明日は他の人がWebサービスを統合できるようにするために、BIIのバグを修正する必要があるときにIBIZインターフェイスと完了を実装するWebサービスを作成するだけですレイヤーは、あなたのウェブサイトとウェブサービスの両方ですでに修正されています。

これを次のレベルに引き上げると、多くの重大な問題を抱えていると言えます。これを処理するにはより強力なサーバーが必要です。実際にはWCFのラッパーであるIDalとIBIZインターフェイスを実装するだけですサーバー間の通信を処理するアプリケーションが複数のサーバーに分散され、コードを変更する必要がなくなりました。

+0

それで、UIはDAと会話するDALと会話するBLと会話します。 BLはEntsをUIに返し、Entsにはデータだけが含まれます。ロジックなどはありません。しかし、UIがEntのデータで自分自身を埋めるのであれば、EntNameはLastName +、+ FirstNameなどのような仕事をするのが妥当と思われます。 – klkitchens

+0

ちょっとしたことがあります。独自のアイテムを追加するだけでユニークであるが、HTMLの作成、UIの責任のようなものを行うべきではないことを確認するために、同じ種類のコレクションチェックを行うAddNonDuplicateメソッドを持つデータエンティティ –

関連する問題