2010-12-19 11 views
12

よろしくお願いします。N-Tierアプリケーションについての初心者のためのアドバイス

私はn層アプリケーションの世界から始めています。私はその話題についていくつか読んだことがあり、一般的なアドバイスは、n層アプリケーションの目的は機能トゥイーン層を抽象化することであるということです。だから、これに基づいて、n型階層アプリで定期的なモデルは次のとおりです。

Data Access -> Business Layer -> Presentation

私は、.NET開発者ですので、私は、複数のクライアントタイプとの統合を強化することを考え(シルバー、ウェブアプリまたはWinFormsクライアント)ビジネス層でWCF(Windows Communication Foundation)をデータサービスとして使用して、クライアントがそのタイプに関係なく通信できるようにする必要があります。また、私はORMとしてNHibernateの巨大なファンです。だから私の構造は次のようになります:

Data Access (NHibernate) -> Business Layer (WCF) -> Presentation (WPF, ASP.NET, WinForms

わかりましたので、それがセットアップされています。私はこの種のアプローチでは初心者だから、ここでこの設定に関するアドバイスを求めて投稿できると思った。また、私はVSソリューションでこれをセットアップする方法について非常に混乱しています。異なるプロジェクトのレイヤーを分離するのが好きですが、データオブジェクト(Customer、Orderなど)の抽象化についてはどうでしょうか?私はemを別のライブラリに入れますか? WCFはどうですか?私は知っているプログラマの罪は、ワイヤを介してクライアントにデータクラスを転送する。これを達成するためのプロの方法は何ですか?

ありがとうございました。アドバイスをいただければ幸いです。

+0

1 - ポイントに問題をもたらす良い質問。それは少しでも主観的かもしれません。 – Lucero

+0

http://stackoverflow.com/questions/1650887/mixing-nhibernate-with-3-tier-developing – Lucero

+0

Lucero、返信いただきありがとうございます。私はすでに質問をチェックし、疑問のいくつかを解決しますが、残念ながら彼のアプローチはあまり好きではありません。誰もがNHibernateエンティティオブジェクトをWCFに直接公開することに反しているようで、ポスターは実際にメディエータサービスクラスを使用する代わりにNHibernateにWCFサービスを関連づけています。私は可能な限り抽象と統合を提供することを楽しみにしています。 –

答えて

14

これはかなり目標です。しかし、N層はN層よりも少し複雑ですが、「あなたの層は実際に別々の物理サーバに置かれていますか?

ビジネスレイヤーの複雑さによっては、ビジネスレイヤーとサービスレイヤーの間でそれをさらに抽象化することができます。通常、これらの2つは非常に密接に結びついており、同じ物理サーバー上に存在します。サービスレイヤーは、しばしばBLLのFacadeとして機能します。

プレゼンテーションレイヤーが同じサーバーにある場合、ASP.NETまたはWinFormsアプリケーションは、WCFサービスを経由せずにBLLと通信したいことがあります。

Microsoft Patterns & Practices - Application Architecture Guideを読んでください。

ドメインオブジェクトは、通常は自分のドメインモデルである自分のアセンブリに存在する必要があります。 Microsoft Framework Design Guidelinesによると、それに応じて、プロジェクトのアセンブリに名前を付けることをお勧めです:

を[会社]​​ [ProductOrComponent] [...]

は私が名前-間隔のこのフォーマットを好きに起こると、一般的に使用します。

[会社] [製品] [レイヤー] [サブレイヤ] [...]

ここでは、各プロジェクトを整理するソリューションフォルダを使用した例ソリューションです:。。。。 alt text

私はこの例では、私はBLLとサービス層を持っています。サービスレイヤは、プレゼンテーションに実際にサービスをホストするWCF Webアプリケーションが含まれている間に、WCFライブラリに実際の実装を提供します。インプリメンテーションをインタフェースから分割することは、常に良い習慣です。

/Clientフォルダは無視してもかまいません。テスト用のサンプルコンソールアプリとして使用するだけです。あなたのサービスを消費するクライアントアプリケーションは、おそらく独自のソリューションを持っているべきです。そうでなければ、巨大なソリューションを管理するつもりです。

あなたのデータオブジェクトは、ワイヤで転送されています...私はあなたのORMのクラスを意味すると仮定しています。 (ドメインモデル)あなたは、その一般的に悪い習慣とみなされるのは正しいです。ソリューションは、データ転送オブジェクトを使用しています。あなたは画像から私が.Dtoライブラリを持っているのを見ることができます。しかし、AutoMapperのようなツールを使用できるのであれば、私はそれだけではありません。あなたのソリューションにDTOを追加すると、さらに複雑さとメンテナンスがもたらされます。私はDino Espositoがこの件について良い記事を書いたと信じています。あなたのためにそれを見つけることを試みます。

これが役に立ちます。


[EDIT]

私はNHibernateはの機能に慣れていないよ、注意してください。そのORMを使用するためのよりよい解決法があるかもしれません。私はEntity Frameworkでしか作業していません。


[EDIT 2]

チェックアウトディノエスポジトの - The Pros and Cons of Data Transfer Objects

+0

さて、あなたの答えは非常に簡単で、私が持っていたすべての疑問をほとんど解決します。 VSソリューションの仕組みと参考文献に感謝します。私は今、App Architectureの書籍のハードコピーを購入することを強く考えています。 –

+0

間違いなく良い買い物。私は言及された両方の本のコピーを自分で印刷しました。偉大な読み取りと参照資料。 – Daniel

関連する問題