3层架构v.3-服务器架构

时间:2010-04-11 17:00:04

标签: c# .net asp.net-mvc architecture 3-tier

我正在构建一个传统的.NET MVC站点,所以我有一个自然的3层软件架构设置(以视图形式呈现,控制器中的业务层,以及模型和数据访问中的数据层)层)。

当我部署此类站点时,它通常位于一台服务器(网站和数据库实时)或两台服务器(一台Web服务器和一台单独的数据库服务器)上。

如何处理3服务器架构(WEB,APP和DB)? Web服务器是否只有演示文稿(例如物理View / aspx页面),app服务器是否会保存配置文件和bin文件夹,db服务器将保持原样?

我的问题基本上是,您可以简单地将/ bin和所有应用程序逻辑移到与演示文稿视图不同的服务器上吗?如果是这样,您如何配置服务器以了解在哪里查看?如果在某个地方有一个好的入门书,或者有人可以给我低调,我将永远感激不尽。

5 个答案:

答案 0 :(得分:6)

MVC 不是 3层架构。并非每个解决方案都需要为3层或n层,但理解这种区别仍然很重要。 MVC碰巧有3个主要元素,但这些元素不能以“分层”方式工作,它们是相互依赖的:

Model <----- Controller
         \       |
          \      v
           ---- View

视图取决于模型。 Controller取决于View 模型。因此,这些多个依赖路径不能用作层。

通常,3层解决方案如下:

Data Access <--- [Mapper] ---> Domain Model <--- [Presenter/Controller] ---> UI

Presenter / Controller在某种程度上是可选的 - 例如,在Windows窗体开发中,您通常看不到它,而是拥有“智能客户端”UI,这也没关系。

这是一个3层体系结构,因为3个主要层(Data,Domain,UI)中的每一个只有一个依赖项。传统上,UI取决于域模型(或“业务”模型),域模型依赖于DAL。在更现代的实现中,域模型依赖于DAL;相反,关系被反转,稍后使用IoC容器注入抽象Mapping层。在任何一种情况下,每个仅取决于之前的层。

在MVC架构中,C是Controller,V是UI(视图),M是域模型。因此,MVC是一种表示架构,而不是一种系统架构。它不封装数据访问。它可能不一定完全封装域模型,可以将其视为外部依赖项。它没有分层。

如果您希望物理分隔层,那么通常通过将域模型公开为Web服务(即WCF)来完成。这为您提供了更好的可扩展性和更清晰的关注点分离 - 域模型可以在任何地方重复使用,并且可以在多台计算机上部署 - 但是它带有重要的前期开发成本以及持续的维护成本。

服务器架构反映了上面的3层图:

Database Server <----- Web Services <----- Application

“Application”是您的MVC应用程序,它与Web服务共享域模型(通过SOAP或REST)。 Web服务在专用服务器(或多个服务器)上运行,显然,数据库托管在自己的服务器上。这是一个3层,3服务器架构。

答案 1 :(得分:4)

在某些圈子中,我看到这个讨论被称为n层和n层之间的区别,其中此上下文中的“层”可能代表另一台机器。为了使用此定义创建中间层,必须托管它。例如,如果您有一个服务层,表示层调用该服务层来获取其数据,那么服务层可以位于与演示文稿或数据库不同的机器上。但是,该服务层作为Windows服务或Web服务托管。即,有一个进程在该机器上侦听请求。因此,您不能简单地将bin文件夹移动到不同的机器上,并希望能够正常工作。我会看一下WCF(Windows Communication Foundation)来创建这些类型的服务。

答案 2 :(得分:1)

ASP.NET MVC无法帮助您设置3tier系统。这实际上只是一种前端模式。

实现多层系统必须解决的主要问题是将对象从一台服务器传输到另一台服务器。您必须找到一种方法来根据传输通道序列化所有对象。这变得缓慢,开发变得更加复杂。

有一个单独的应用服务器的原因:您可能有其他应用程序需要的逻辑或应用服务器可能具有与Web服务器不同的权限。但很难想象一个高流量的网站,所有请求都会导致呼叫远程应用程序 - 服务器。

答案 3 :(得分:0)

下一个逻辑扩展将是两个Web服务器和一个数据库服务器。

最后添加许多Web服务器后,可能需要添加服务层。

您可能还希望在扩展时添加分布式缓存,会话状态服务器,电子邮件服务器和其他专用服务器。

答案 4 :(得分:0)

所以你的问题似乎是......

“你能简单地将/ bin和所有app逻辑移到与演示文稿视图不同的服务器上吗?”

如果我理解正确,我相信你的bin文件夹中的文件将是你的asp.net页面的编译代码。如果是这样的话,不,我相信他们需要和asp页面在同一台机器上。

如果您希望将业务逻辑放在表示层的单独机器上,则需要将该代码包装成单独的dll并通过soap或其他协议公开它。然后调用那些SOAP暴露的dll来自表示层代码的其他服务器。