MVC不是3 层架构。并非每个解决方案都需要是 3 层或 n 层,但了解区别仍然很重要。MVC 恰好有 3 个主要元素,但这些元素不能以“分层”方式工作,它们是相互依赖的:
Model <----- Controller
\ |
\ v
---- View
视图取决于模型。控制器依赖于视图和模型。因此,这些多个依赖路径不能用作层。
通常,3 层解决方案如下所示:
Data Access <--- [Mapper] ---> Domain Model <--- [Presenter/Controller] ---> UI
Presenter/Controller 在某种程度上是可选的 - 例如,在 Windows 窗体开发中,您通常看不到它,而是有一个“智能客户端”UI,这也可以。
这是一个 3 层架构,因为 3 个主要层(数据、域、UI)中的每一个都只有一个依赖项。传统上,UI 依赖于域模型(或“业务”模型),而域模型依赖于 DAL。在更现代的实现中,域模型不依赖于 DAL。相反,这种关系是倒置的,稍后会使用 IoC 容器注入一个抽象的映射层。在任何一种情况下,每一层都只依赖于前一层。
在 MVC 架构中,C 是 Controller,V 是 UI(视图),M 是 Domain Model。因此,MVC 是一种表示架构,而不是一种系统架构。它不封装数据访问。它可能不一定完全封装了域模型,可以将其视为外部依赖项。它没有分层。
如果您想在物理上分离这些层,那么通常通过将域模型公开为 Web 服务(即 WCF)来完成。这为您提供了改进的可扩展性和更清晰的关注点分离 - 域模型实际上可以在任何地方重用,并且可以部署在许多机器上 - 但伴随着大量的前期开发成本以及持续的维护成本。
服务器架构反映了上面的 3 层图:
Database Server <----- Web Services <----- Application
“应用程序”是您的 MVC 应用程序,它与 Web 服务(通过 SOAP 或 REST)共享一个域模型。Web 服务在一个(或多个)专用服务器上运行,而数据库显然托管在它自己的服务器上。这是一个 3 层、3 个服务器的体系结构。