MVCは3層アーキテクチャではありません。すべてのソリューションが3層またはn層である必要はありませんが、その違いを理解することは依然として重要です。MVCにはたまたま3つの主要な要素がありますが、これらの要素は「階層化」された方法では機能せず、相互に依存しています。
Model <----- Controller
\ |
\ v
---- View
ビューはモデルによって異なります。コントローラは、ビューとモデルによって異なります。したがって、これらの複数の依存関係パスは層として機能しません。
通常、3層ソリューションは次のようになります。
Data Access <--- [Mapper] ---> Domain Model <--- [Presenter/Controller] ---> UI
プレゼンター/コントローラーはややオプションです。たとえば、Windowsフォーム開発では、通常は表示されませんが、代わりに「スマートクライアント」UIがあります。これも問題ありません。
3つの主要な層(データ、ドメイン、UI)のそれぞれに依存関係が1つしかないため、これは3層のアーキテクチャです。従来、UIはドメインモデル(または「ビジネス」モデル)に依存し、ドメインモデルはDALに依存します。最近の実装では、ドメインモデルはDALに依存しません。代わりに、関係が反転され、後でIoCコンテナを使用して抽象的なマッピングレイヤーが挿入されます。いずれの場合も、各層は前の層にのみ依存します。
MVCアーキテクチャでは、Cはコントローラー、VはUI(ビュー)、Mはドメインモデルです。したがって、MVCはプレゼンテーションアーキテクチャであり、システムアーキテクチャではありません。データアクセスはカプセル化されません。ドメインモデルを完全にカプセル化するとは限らない場合があります。これは、外部の依存関係として扱うことができます。階層化されていません。
層を物理的に分離したい場合は、通常、ドメインモデルをWebサービス(つまり、WCF)として公開することによって行われます。これにより、スケーラビリティが向上し、関心の分離がより明確になります。ドメインモデルは文字通りどこでも再利用可能であり、多くのマシンに展開できますが、かなりの先行開発コストと継続的なメンテナンスコストが伴います。
サーバーアーキテクチャは、上記の3層図を反映しています。
Database Server <----- Web Services <----- Application
「アプリケーション」はMVCアプリケーションであり、ドメインモデルをWebサービスと(SOAPまたはRESTを介して)共有します。Webサービスは専用サーバー(または複数のサーバー)で実行され、データベースは明らかに独自のサーバーでホストされます。これは、3層、3サーバーのアーキテクチャです。