【问题标题】:Compare between 3-Layer pattern and MVVM3-Layer 模式与 MVVM 的比较
【发布时间】:2011-02-28 12:02:54
【问题描述】:

我不知道 MVVM。我总是遵循三层模式,一层是UI,另一层是业务层,最后一层是数据访问层。

在这一层中,我们从 UI 向业务层发送请求,业务层与数据访问层交互。在这种模式下,一切都很好,然后我的问题是为什么要学习 MVVM。 MVVM 有什么优势。使用 MVVP 可以做的事情很少。请详细讨论。谢谢。

【问题讨论】:

  • "什么事情可以用 MVVP 做很少的努力" - 你是说 MVVM 还是 MVP?因为两者都是三层 UI 设计模式。
  • 您所描述的 3 层是模棱两可的。您是指多层架构,其中应用程序的逻辑在不同的服务器(UI、Web 服务、数据库层)之间拆分,还是您的本地客户端应用程序代码分为三个?

标签: c# wpf mvvm


【解决方案1】:

层次

与 ppl 在我之前写的相反 - MVVM 模式不是将 UI 层拆分为 3 层,而是将 UI 层拆分为两个额外的层 - View 和 ViewModel。

所以如果我们有 DAL、BLL 和 UI,现在我们有 Model(DAL & BLL) 和 ViewModel + View(而不仅仅是一层 UI)。

它仍然是 3 层,但编排方式不同(如果你真的考虑一下 - DAL 从来都不是真正的层 - 它最多是一个辅助类,所以前面提到的 3 层实际上只是 2 层,现在正在变成MVVM 中的 3 层)。

原因

如果你仔细想想,你会发现在 3 层架构中,通常 UI 与表示代码和应用程​​序逻辑代码混合在一起。这违反了 SRP(单一职责原则),并且出于多种原因是不好的。 在 MVVM 中,UI 层分为两层。 ViewModel 负责应用程序逻辑,而 View 仅负责演示。

这可以让你做三件非常重要的事情:

  1. 更好的代码可维护性

  2. 更容易与 VS 设计器和 Blend 一起工作。又名混合性。 (这可以说是 MVVM 最强大的功能。它确实提高了生产力)

  3. 允许使用自动化测试来测试 ViewModel,而到目前为止,我们必须测试 UI 本身,并且对 UI 进行自动化测试很复杂。这称为可测试性

个人笔记;多年来,我一直在写 n 层架构。一年多以前,我开始练习 MVVM。在某些时候这可能是一段艰难的旅程,但是伙计,这真的值得付出努力。

【讨论】:

  • 我认为这是思考 MVVM 的正确方式。真的,MVVM 真的应该被称为 VVM——它与视图模型对话的内容是不可知的。事实上,如果您很懒惰并将功能放在视图模型中,那么可以编写没有模型的简单 MVVM 应用程序。
  • 模型由用户自行定义这一模式很重要,但我认为准确使用“二”和“三”这两个词会混淆问题。但是这个答案缺少的主要内容是 MVVM 与其他 MVC 衍生产品背后的基本原理。混合支持就是其中之一,但即使没有混合,MVVM 也有强大的用例。可维护性和可测试性很好,但在其他类似 MVC 中也同样好。并不是说我的答案更好,因为它只链接到此类信息。一个关键信息是松散耦合是通过反射/事件而不是强类型接口完成的。
  • 我不得不说我不同意。在 MVVM 中的可维护性比在 MVC 中要好得多,在 MVC 中的 b/c 控制器有两个职责 - 处理与模型和控制器的交互。然而,在 MVVM 中,ViewModel 仅与应用程序的逻辑和状态有关,因此保留 SRP 原则是一种更严格的方式。这有助于使代码更易于维护,这也是 MVVM 更好的 #1 原因。
  • MVC 是一类设计模式,MVVM 是其近亲。 MVC可以写成几乎类似于 MVVM,因为对于每个类的具体或抽象程度,或者哪些层被强制相互通信,并没有一成不变的规则。 MVVM 有独特的功能(数据绑定),但 MVVM 本身并不能保证松散耦合。我见过一些项目弄错了,结果导致可测试性受损。我并不是说你说的那些东西不是真的,只是它们不完整,并且可以给人一种 MVVM 是灵丹妙药的印象。
  • @Merlyn:MVVM,正确实现,在绝大多数 WPF/SL 应用程序中,确实是灵丹妙药 :)
【解决方案2】:

MVVM 用于构建 UI 层。它是一种模式,可以在您的业务对象和 UI 框架之间实现非常好的交互。您不必更改您的 3 层模式。 MVVM 处于另一个抽象级别。
Here 你会发现一个非常好的视频介绍 MVVM,并且可能回答了很多问题。

【讨论】:

    【解决方案3】:

    MVVM 本身可以说是一个三层架构。这些层都存在于同一个应用程序中。

    “3-layer”有时也指n-tier architecture,更多的是将UI、服务层和数据层分离到不同的服务器上。如果你有这种分层,那么 MVVM 不会取代它。它只会扩充 UI 层,将其分成自己的三层。

    这是一篇关于 MVVM 的文章,通过 MVP 和 MVVM 展示了经典 MVC 之间的一些关系:

    http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

    另见my answer to this other question。它解释了您将在 MVC 上使用 MVVM 的一些原因。

    【讨论】:

      【解决方案4】:

      MVVM 与 WPF、Silverlight/Moonlight 和 Windows Phone 7 特别相关,因为它利用了这些框架中内置的强大数据绑定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        • 2019-07-23
        • 2016-03-12
        • 2016-05-03
        • 1970-01-01
        相关资源
        最近更新 更多