在客户端 - 服务器体系结构中使用MVC(模型视图控制器)

时间:2011-10-30 05:38:34

标签: design-patterns model-view-controller client

我正在尝试为我正在开发的应用程序选择一种设计模式。该应用程序主要基于客户端 - 服务器架构,其中客户端基本上读取和写入数据到服务器;然而,客户端必须安装软件可执行文件,然后与GUI交互,以便通过互联网协议与服务器(在不同的机器上退出)进行通信。

由于应用程序基于与GUI的大量交互,我正在考虑使用MVC设计模式,问题是我无法确定服务器上应该存在哪个部分以及客户端应该存在哪个部分。换句话说,是否可以在客户端使用查看(即边界GUI类和对象)和控制器,同时保留模型< / strong>(即实体对象)在服务器端;这是应用MVC模式的可行或有效方式吗?我在这里朝着正确的方向前进吗? 这甚至可能吗?我的意思是那些Boundary和Control类可以在没有或访问同一台机器或进程上的Model类的情况下运行和执行吗?

我是否应该在客户端拥有整个(模型,视图和控制器类),然后通过协议与服务器数据库进行通信?

欢迎任何建议或意见。

5 个答案:

答案 0 :(得分:4)

在客户端 - 服务器设置中有很多实现MVC的方法。通常,您在客户端中放入的内容越多,您的应用程序就越“丰富”或“越来越”。所以,如果您决定使用MVC,那么真正的问题就变成了:我希望我的应用程序有多丰富?

此外,您可以让多个MVC实例在一个应用程序中协同工作,分布在客户端和服务器上。

我要看的一些事情:

  • 网络:客户端和服务器之间需要传输多少数据?应用程序通常会发送多少个请求? (太多可能会使网络饱和或造成其他麻烦)

  • 响应能力:更高的响应能力可能要求您在客户端中添加更多内容

  • 安全性:通过网络传输的所有内容可能不太安全

  • 性能:如果您需要高性能,则可能需要服务器上的组件

  • 预期负载:您可能决定将更多组件客户端卸载服务器,而不是集中后端,例如

答案 1 :(得分:1)

您对使用MVC的想法非常正确。这将帮助您解除分离事务,并为您提供更多的课程控制。

我建议在客户端保留视图。我会将控制器和模型类保留在服务器上。控制器是一个棘手的组件。可能很容易将其保留在客户端上,将其放在服务器上的原因是:与DAO的交互,与Model类的交互,错误处理和控制流(屏幕/操作)。

客户端的控制器可能很容易开发,但最终你需要将更改(如按钮按下,点击等)传递给服务器。此外,客户端的控制器将慢慢开始推动您在客户端上越来越多的类。

答案 2 :(得分:0)

经过大量研发后,我发现大部分控制器和客户端视图的性能最佳,而且服务器上的控制器和型号也只占很小的一部分。然后你可以说控制器是在客户端和服务器上分开的 - 好处是如果控制器需要已经缓存在客户端的资产,它实际上避免了网络流量,这对于快速运行很重要。以下是一个示例:http://www.youtube.com/watch?v=g73GcQqrDeA

基本上我发现如果使用服务器端模板引擎或任何可以从浏览器中丢失缓存的东西,性能都很糟糕,所以所有html必须是100%静态的。仅使用jQuery,开箱即用它提供了非常有用的事件绑定工具,您可以将其委托给也可以在浏览器中缓存的Controller类。最后,唯一来回传输的数据是JSON - 只需注意使您的服务器安全,对所有重要的标识符进行编码/加密,确保它们在会话之间即使是相同的用户也不一样...... < / p>

答案 3 :(得分:0)

您无法将传统的MVC真正应用于服务器 - 客户端架构。原因包括:

  • 服务器和客户端具有不同的运行时和API。
  • 出于安全原因,您必须在服务器上有一些业务逻辑,但除非每个用户操作都执行到服务器的往返并返回,否则您必须具有一些业务逻辑客户端(考虑表单验证)。实际上,这意味着您在上都有模型。
  • 在传统的MVC中,控制器保持对模型的引用。客户端上的控制器无法真正保留对服务器上模型的引用,因为网络外观。
  • 更重要的是,在传统的MVC中,模型层具有 all 模型记录。在许多Web应用程序中,客户端只能获得部分模型(想想第3页中的第1页)。
  • 最后两点也意味着客户端中的(部分)模型实际上并不是您的模型 - 如果同一模型有两个视图(想想一个分页的客户端列表,以及一个带有远程搜索的预先输入的下拉列表)不同的观点)还有两个控制器 - 每个控制器都有自己的模型。因此,该模型实际上是幻像视图模型,而不是真实模型。

还有更多原因,但我认为上述原因证明了这一点。

有很多方法可以解决这个问题,获得与MVC非常接近的东西可能涉及客户端的模型代理。更具抽象性/灵活性的基于代理的体系结构。

答案 4 :(得分:0)

对于灵活的架构,您可能有耦合控制器,即 cliXController 和 srvXController,一个用于客户端,另一个用于服务器端。通过这种拆分,您将在各种决策点上具有灵活性,例如将 View 组件放在客户端或服务器端,或者可能放在双方。您可能需要一些视图的服务器端渲染和一些视图的客户端渲染。另一方面,由于其他答案中提到的各种原因,我建议将所有模型组件都放在服务器端。