MVC与n-tier架构的比较

150

我想知道MVC(一种架构模式)和n层架构在应用程序中的区别。我搜索了一下,但找不到简单的解释。也许我对MVC概念有点幼稚,所以如果有人能够解释一下它们之间的区别,那就太好了。

12个回答

107

N层架构通常将每一层通过网络进行分离。例如,表示层位于某些Web服务器上,然后与后端应用服务器通过网络进行业务逻辑交互,之后再通过网络与数据库服务器进行交互,也许应用服务器还会调用某些远程服务(例如Authorize.net进行付款处理)。

MVC是一种编程设计模式,其中不同的代码部分负责表示应用程序中的模型、视图和控制器。这两个概念之间有关联,因为例如模型层可能具有内部实现,该实现调用数据库来存储和检索数据。控制器可能驻留在Web服务器上,并远程调用应用服务器来检索数据。MVC抽象了应用程序的体系结构实现细节。

N层仅仅指的是一种物理实现结构。这两个概念有时会混淆,因为MVC设计通常使用N层架构来实现。


62
N-tier也是一种设计模式,你不需要三个服务器来实现一个三层系统,实际上,可以使用单个文件来实现N层系统,通过一个概念上的概念将每个层分开。 - magallanes
7
Tier 的基本含义是指在进程间进行通信,通常是通过网络链接实现的。我不认同在同一文件(更不用说同一进程)中的代码设计流程构成了分层设计方法。当然这只是我的个人意见。"Server" 暗示着该机器可以在同一个盒子上运行多个进程,并且它们可能仍然可以在 "localhost" 网络上通信。 - Zak
2
所有讨论的格式都是三层设计的示例。不要混淆层和层次之间的区别。确实,您可以在一台物理机器上运行多个层(例如,通过虚拟化程序将大型服务器分割),但这里的重点是N-Tier暗示了物理网络跳跃(例如,TCP/IP)。在本地,使用命名管道会更有效,但同样,如果在同一系统上运行,则会竞争内存和处理能力。所有这些都是考虑将演示、业务逻辑和数据访问以及数据库隔离在不同的计算机上的原因。 - Zack Jannsen
1
我建议阅读这个问题的任何人都应该阅读其他答案,因为这个答案是不准确的。 - keisar
1
@magallanes,跟着'Zak'走,首先我们需要澄清Tier和Layer之间的区别。这里有一篇非常好的codeproject文章,其中有清晰的解释。 - Irf
显示剩余2条评论

46

如果一个三层设计像这样:

Client <-> Middle <-> Data

使用MVC模式:

     Middle
     ^    |
     |    v
Client <- Data

这意味着:

  • 在三层结构中,层之间的通信是双向的,且始终通过中间层进行
  • 在MVC中,通信是单向的;我们可以说每个“层”都由左侧的层更新,并反过来更新右侧的层——其中,“左侧”和“右侧”仅为说明

注:客户端将是视图中间层则是控制器


15
在MVC中,模型能直接与客户端(视图)进行交互吗?我认为不行! - palAlaa
6
@Alaa,我同意这一点,这就是为什么我“认为”它是指数据流的原因。更新:我刚在维基百科上查看了,模型可以通过观察者与视图进行交互(而不是直接交互)。 - void
1
在MVC中:MVC架构是三角形的:视图将更新发送到控制器,控制器更新模型,而视图直接从模型获得更新。在三层架构中:三层架构是客户端层永远不会直接与数据层通信,在三层模型中,所有通信都必须通过中间层进行。 - ketan italiya
1
如果Middle是一个控制器,那么Middle、Client和Middle、Data之间的通信是双向的,而不是答案中描述的单向的。控制器将数据传递给模型,模型将更新后的数据返回给控制器,然后通过视图返回给浏览器。 - Dragon

33

这是对于n-tier architecture的表述:

乍一看,三层架构可能与MVC(模型视图控制器)概念相似;然而,在拓扑上它们是不同的。在三层架构中的一个基本规则是客户端层永远不会直接与数据层通信;在三层模型中,所有通信都必须通过中间件层。从概念上讲,三层架构是线性的。然而,MVC架构是三角形的:视图将更新发送到控制器,控制器更新模型,视图直接从模型获取更新。


11
听起来不错,但我不认为“视图直接从模型更新”是一个好主意。使用控制器进行更新和插入,而不使用选择和过滤,这没有意义。而且,我也看不出只是将视图绑定到模型有什么分离关注点的意义!结论- MVC是另一种由某些人创造的混淆术语....你猜猜是谁。我不记得三层结构被限制在“系统架构”或“应用程序设计”。核心概念是关注点分离 - Sam
1
这要看你在做什么。iOS应用程序的MVC应用(很可能不允许从模型直接更新视图)与Web应用程序的MVC应用是不同的。MVC是一种范例,而不是一种绝对的做事方式。 - Raydot
3
完全同意@Sam的观点。对于一个直观的概念来说,术语太多了。 - smwikipedia
1
听起来不错,但是不起作用。维基百科并不是最终的真相来源。 - ACV
这取决于你如何解释真相,同时也取决于你的目标是什么。 - Xinus

20
唯一的相似之处在于这两种模式在其图表中都有三个方框。从根本上讲,它们在用途上完全不同。实际上,通常并不是选择使用哪种模式,而是两种模式可以和谐地一起使用。以下是两者的良好比较: http://allthingscs.blogspot.com/2011/03/mvc-vs-3-tier-pattern.html 此图显示了如何将两种模式一起使用,MVC仅用于Presentation/UI层: mvc3tiercombo

4
我认为这是目前为止最好的答案,特别是因为MVC真正专注于UI,并且它可以成为三层设计中的UI层。链接中的图示非常清晰地表明了这一点。 - Alex

7

给自己放松一下,解决现实世界中的问题时不要限制自己的思维方式。只需记住一些通用原则之一是关注点分离


6

三层体系结构的基本规则是客户端层永远不直接与数据层通信;在三层模型中,所有通信都必须通过中间件层。

这是一种线性体系结构。它解决了如何在用户和数据库之间传递信息的问题。而MVC是一个三角形的体系结构:视图(View)将更新发送给控制器(Controller),控制器更新模型(Model),并且视图直接从模型获取更新。这解决了用户界面如何管理屏幕上的组件的问题。


6

@Cherry 中间件在MVC模式中更像请求处理程序或重定向器。

我想简单解释一下MVC,对我来说,模型视图控制器的工作方式如下:

  1. 客户端通过请求任何服务启动会话。
  2. 此请求由控制器(请求处理程序、重定向器等)接收和处理。
  3. 控制器在请求上处理基本信息,并将其重定向到相应的模型,以填充数据请求。
  4. 模型根据控制器传递的参数填充请求并将结果发送回控制器。(注意:这里我想澄清的是,在真正的MVC架构中,数据不会直接返回给客户端,而是填充并返回给控制器。)
  5. 控制器将数据发送给视图(客户端)。
  6. 客户端可以看到所请求的服务。

这就是我所知道的关于MVC的所有内容。


1
我认为,就像上面所说的那样,MVC是三角形的,因此视图有时可以直接与模型交流,反之亦然,正如在这个文档中所解释的:http://msdn.microsoft.com/en-us/library/ms978748.aspx。 - ychaouche

5

除了是线性的之外,N层模型与其他模型的另一个主要区别是,在N层模型中,N不一定是三层!它通常被实现为三层(表示层、应用层、数据层),其中中间层有两个子层(业务逻辑和数据访问)。此外,在MVC模型中,模型可以包含数据和用于数据操作的业务逻辑,而在N层模型中,这些将位于不同的层中。


5

N-Tier架构最好使用部署图进行定义。

MVC架构最好使用序列图进行定义。

这两者不同且无关,您可以将两种架构结合在一起。许多公司已经采取了创建N层架构的步骤,不仅为了部署和可扩展性,还为了代码重用。

例如,您的业务实体对象可能需要被桌面应用程序、为客户端公开的Web服务、Web应用程序或移动应用程序所使用。仅仅使用MVC方法将无法帮助您重用任何东西。


如果在您的特定情况下MVC没有重用任何内容,那么与N层架构相比,MVC有哪些好处呢? - Dragon

3
结论:N层架构是一种架构,MVC是一种设计模式。它们是应用于两个不同领域的相同比喻。
(Note: I have retained the HTML tags as requested.)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接