将客户端MVC / MVVM模式与MVC服务器端模式一起使用

时间:2012-08-01 17:29:30

标签: model-view-controller design-patterns mvvm client-side server-side

考虑到最流行的MVC / MVVM客户端模式(如Knockout.jsAngular.jsEmber.js等),我有一个很大的疑问:

还考虑了双方的建模冗余,将这些客户端模式与MVC服务器端模式一起使用有哪些优势和劣势?

5 个答案:

答案 0 :(得分:14)

我一直在努力解决这个问题...希望这会有所帮助,即使它是一个圆形的方式。

虽然已经说明了一些优点/缺点,但我认为最好的纲要是this answer

对我来说,使用客户端逻辑的最大优势是丰富的UI方面。

但你问题的关键部分似乎是“模型冗余”(我称之为重复逻辑,或者至少具有重复逻辑的潜力)。在我看来,这是一个独立于前一个链接中的优点/缺点的问题。

首先,我认为是否应该使用客户端框架的决定应该基于充分记录的优缺点。做出决定后,可以解决相关问题。

让我们假设您正在使用某种服务器端框架/平台,以及客户端框架来提供一些UI交互性。现在将模型逻辑放在何处存在问题:在客户端,服务器或两者上。

解决问题的一种方法是仅在客户端中定义模型逻辑。然后你没有代码重复,但它会影响一些更高级别的优点/缺点。

例如,如果您的模型逻辑是100%服务器端,则会丢失UI的某些交互式部分。或者,你经常将模型扔进服务器,这将有一些缺点。

如果您的模型逻辑是100%客户端,则可能会遇到性能问题,具体取决于视图/模型的大小。这是Twitter转向服务器端处理模型的原因之一。

然后有“两者”......在客户端和服务器中都存在模型逻辑。我认为这是最好的解决方案,只要没有逻辑重复

例如,在购物车页面上,您可以根据产品价格和用户可编辑的数量框重新计算订单的成本。我认为这种逻辑应该只存在于客户端上。一旦加载就不会改变的其他模型属性可能很好地托管在服务器上。

这里有很多灰色地带......我很难把所有鸡蛋放在一个篮子里。例如,选择客户端框架,创建大量客户端逻辑,然后[假设]遇到性能,浏览器支持或类似问题。现在你可能想调整一两页的性能(比如移动服务器端,推特)。但我认为,如何构建代码是明智的,这有助于缓解这个问题。如果您的代码是可维护和清洁的,那么将逻辑从客户端移动到服务器并不困难。

答案 1 :(得分:5)

优点是客户端模式适用于服务器无法直接访问的客户端。如果您正在构建一个丰富的交互式HTML UI,那么请使用客户端MVVM。在这种情况下,服务器端MVC可能仍然与向客户端传送适当的内容相关。例如,ASP.NET WebAPI是一个用于创建HTTP API的框架,它具有与ASP.NET MVC框架类似的控制器体系结构。使用此框架实现的API可以由客户端代码调用,从而在服务器端生成MVC,在客户端生成MVVM。通常,当使用MVC服务器端和MVVM客户端时,各方的职责非常不同,因此没有冗余。

答案 2 :(得分:3)

您将MVVM模型合并到已经实现的MVC框架中的事实也是一件好事,我们最近在一些已经过时的MVC框架(旧页面,而不是框架本身)中添加了一些新的项目页面。 。

我认为MVVM很棒,因为上面的答案表明它提供了极快的响应时间的卓越用户体验,你可以在后台隐藏你的验证调用而不会降低它们的直观性。

然而痛苦的是,它非常难以进行单元测试,你可以得到一些非常大的javascript文件,还有我们不得不做的额外编码,因为我们的遗留系统仍在IE6上运行是荒谬的。

但MVVM和MVC不必单独使用,我们同时使用它们。但是有三个级别的验证仍然让我感到困扰。

答案 3 :(得分:2)

  • 优点
    • 这可以摇滚。
  • disvantages
    • 你可以搞定它。

严重。利用将部分前端逻辑传输到浏览器中可以增强应用程序开发,为什么要在服务器端封装更严格的数据处理。

这基本上是分层的。两层,上面的一层与下面的一层谈话,反之亦然:

[client] <--> [server]

您通常以轻量级序列化格式(如两者之间的Json)交换值对象。

这可以很好地映射用户对有用结构的期望,而服务器端的域对象可能不那么详细。

然而,真正的力量将是如果服务器端在某些特定点没有用javascript编写,因为我认为你不能在那里创建好的域对象。如果遇到这个问题,请考虑使用Scala(或类似的表达方式)然后

答案 4 :(得分:2)

在这个问题发布十个月之后,我在同一个应用程序中使用了这两种模式。

唯一的问题是需要两次映射模型。

MVC(ASP.NET MVC 4 Web API)

最重要的资源是路线。

  • 为数据库交互创建模型,并作为参数 控制者的行为。
  • 创建控制器以操纵API 请购单和呈现视图。
  • 视图未使用 服务器端模型,但部分视图和部分视图的所有资源 部分。

MVVM(Knockout.js)

  • 使用与服务器端模型相同的属性创建模型。
  • 视图与模型的属性绑定在一起,并减少了很多视图的大小。
  • 使用API​​方法提供的值创建了视图模型。

总的来说,MVC与MVVM的结合非常有用,但它需要大量的专业知识和知识。耐心也是必需的,因为你需要考虑每个应用层的责任。