4

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

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

如何实现 3 服务器架构(WEB、APP 和 DB)?Web 服务器是否只有演示文稿(例如物理视图/aspx 页面),应用程序服务器将保存配置文件和 bin 文件夹,而 db 服务器将保持原样?

我的问题本质上是,您可以简单地将 /bin 和所有应用程序逻辑从演示视图移到单独的服务器上吗?如果是这样,您如何配置服务器以知道在哪里查找?如果某处有一本好的入门书,或者有人可以告诉我内幕,我将永远感激不尽。

4

5 回答 5

6

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 个服务器的体系结构。

于 2010-04-11T19:06:01.770 回答
4

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

于 2010-04-11T17:06:01.033 回答
1

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

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

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

于 2010-04-11T18:25:28.270 回答
0

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

最终,在添加了许多 Web 服务器之后,可能值得添加一个服务层。

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

于 2010-04-11T17:10:59.580 回答
0

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

“你能简单地将 /bin 和所有应用程序逻辑从演示视图移到单独的服务器上吗?”

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

如果您想将业务逻辑与表示层放在单独的机器上,您需要将该代码包装到单独的 dll 中并通过soap或其他协议公开它..然后在其他服务器上调用这些 SOAP 公开的dll表示层中的代码。

于 2010-04-11T18:32:32.507 回答