3 层模式与 MVVM 的比较

2024-04-01

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

在这一层中,我们将请求从 UI 发送到业务层,业务层与数据访问层进行交互。在这种模式下,一切都很顺利,那么我的问题是为什么要学习 MVVM。 MVVM 的优点是什么?有哪些事情可以使用 MVVP 轻松完成。请详细讨论。谢谢。


层次

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

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

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

原因

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

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

  1. 更好的代码可维护性.

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

  3. 允许通过自动化测试来测试 ViewModel,而到目前为止我们必须测试 UI 本身,并且对 UI 进行自动化测试很复杂。这就是所谓的可测试性

就个人而言;我多年来一直在写 n 层架构。我一年多前开始练习 MVVM。有时候这可能会是一段艰难的旅程,但是伙计,这是really值得努力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3 层模式与 MVVM 的比较 的相关文章

  • strtok() 和空字段

    我正在将一些 C 结构序列化为字符串 然后将其反序列化strtok 但不幸的是 strtok 不检测空字段 例如 1 2 4 有没有替代功能 在linux上有strsep http www mkssoftware com docs man3
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • 氧图。如何将轴旁边的值格式从 1000 更改为 1k

    我正在尝试更改轴旁边的值的格式 例如从 1000 更改为 1k 或 1000000 更改为 1M 这在 LinearAxis 中可能吗 这是我的代码 m Axes Add new LinearAxis Position AxisPositi
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 以概率从列表中选择随机元素

    我有一个包含四个项目 A B C D 的列表 每个项目都有被选择的概率 例如 A 有 74 的机会被选中 B 15 C 7 D 4 我想创建一个函数 根据其概率随机选择一个项目 有什么帮助吗 为您的项目定义一个类 如下所示 class It
  • 如何获取 C# PriorityQueue 元素的优先级

    我正在初始化一个存储 XY 坐标的优先级队列 根据距原点的欧几里得距离确定优先级 我创建了一个自定义Comparer这使得它作为最大堆运行 PriorityQueue
  • 如何使用 C# 调用 REST API?

    这是我到目前为止的代码 public class Class1 private const string URL https sub domain com objects json api key 123 private const str
  • 如何使用 DesignData 帮助开发 Metro 应用程序?

    我一直在 Windows Phone 应用程序中愉快地使用 DesignData 我希望使用它来帮助在 VS2012 Blend for VS 中的 Metro 风格应用程序中可视化设计 我已经尝试过希望显而易见的方法
  • const_iterators 更快吗?

    我们的编码指南更喜欢const iterator 因为它们比正常的要快一点iterator 当您使用时 编译器似乎会优化代码const iterator 这真的正确吗 如果是的话 内部到底发生了什么使得const iterator快点 编辑
  • 有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录?

    有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录 我们正在使用我们自己的抽象 我不希望在使用 Serilog 时来自 Hangfire 记录器的所有额外噪音 INIT call under web project na
  • 使用 MessagingCenter 和标准 .NET 事件处理程序向感兴趣的各方通知更改有什么区别?

    使用 MessagingCenter 和标准 NET 事件处理程序向感兴趣的各方通知更改有什么区别 下面演示了同一事物的两个 未经测试的 实现 public class FooClass public event EventHandler
  • C++ 为非虚方法指定初始化

    我有 a h 如下所示 class A public void doSomething 0 然后我有 b h 如下所示 include a h class b public A public void doSomething 我只是想通过尝
  • 模板“内联”函数的静态局部变量[重复]

    这个问题在这里已经有答案了 static的局部变量inline如果我的理解是正确的 C 中的函数保证像单个全局变量一样存在 如果inline函数是一个模板 编译器可以在哪里生成该函数的多个版本 下面这篇文章应该很好地回答你的问题 http
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • Bool类型返回规则

    我使用 dapper ORM 所以我使用两个规则Query
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • 如何在 C# 中停止程序进一步执行

    string FirstName Console ReadLine if FirstName Length gt 12 Console WriteLine if FirstName Length lt 3 Console WriteLine
  • 从 TFS 下载工作项附件(文件已损坏)

    我正在尝试创建 C 代码 因此我可以自动从 Team Foundation Server 下载 BUGS 预定义查询的所有附件 该代码似乎工作得很好 但所有下载的文件都因意外原因而损坏 我无法查看它们 有人可以看一下代码并分享意见吗 非常感
  • 在运行时将项目添加到 ToolStrip

    您好 我有一个带有 收藏夹 菜单的 ToolStripMenu 我想在运行时在 WinForms 应用程序中添加子项目 我有一个 datagridview 右键单击它会显示一个包含 添加到收藏夹 选项的上下文菜单 当该事件被触发时 我想使用
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo

随机推荐

  • AVRDUDE Android Arduino ioctl 错误

    我之前的问题 Android 无法使用 AVRDUDE 与 Arduino 通信 https stackoverflow com questions 15596376 android cannot talk to arduino using
  • 为什么说内核位于进程地址空间中?

    这可能是一个愚蠢的问题 但它突然出现在我的脑海中 所有有关进程地址空间和虚拟内存布局的文本都提到进程地址空间 为内核保留的空间 例如在 32 位系统上 进程地址空间为 4GB 其中 1GB 为 Linux 中的内核保留 在其他操作系统上可能
  • SCRAM 身份验证需要 [重复] 中的 libpq 版本 10 或更高版本

    这个问题在这里已经有答案了 当我尝试使用 PHP 连接到 Postgresql 服务器时 出现错误 如下所示 无法连接到 PostgreSQL 服务器 SCRAM 身份验证需要 libpq 版本 10 或更高版本 我使用 Enterpris
  • Python IDLE 在历史中搜索(类似于 bash 中的 Ctrl+R)

    IDLE ide中是否有相当于python的东西bash 中的 Ctrl R http www lornajane net posts 2011 navigating bash history with ctrlr 您在其中键入该行的一部分
  • boost share_mutex 的示例(多次读取/一次写入)?

    我有一个多线程应用程序 必须经常读取一些数据 并且偶尔会更新数据 现在 互斥体可以安全地访问该数据 但它很昂贵 因为我希望多个线程能够同时读取 并且仅在需要更新时将它们锁定 更新线程可以等待其他线程完成 我想这就是boost shared
  • GNU make - 强制 PHONY 目标的依赖顺序

    我有一个如下的 Makefile 我关心的是依赖顺序up clean PHONY up up down docker compose up d PHONY up clean up clean down clean up PHONY down
  • 如何通过 url 从服务器下载音频文件

    如何通过 url 从服务器下载音频文件并将其保存到 SD 卡 我正在使用下面的代码 public void uploadPithyFromServer String imageURL String fileName try URL url
  • 无法在 Azure DevOps CD 上部署 DacPac

    我正在建设DacPac使用 Visual Studio 从数据库项目中获取文件 另外 在调试Drop tab in Advanced Build Settings 我启用了以下选项 不要丢弃凭据 不要删除数据库角色 不要删除数据库范围的凭据
  • 向 UIScrollView 添加垂直两指滑动手势

    根据如何为所有屏幕的 iPhone 应用程序添加垂直滑动手势 https stackoverflow com questions 4640000 how to add a vertical swipe gesture to iphone a
  • Predis 给出“从服务器读取行时出错”

    我在用predis https github com nrk predis 它已订阅频道并正在收听 它抛出以下错误 如下 并在 60 秒后死亡 这肯定不是我的网络服务器错误或其超时 有一个类似的问题正在讨论here https github
  • 为像素分配负值

    使用某些标准 图像中有一些我不感兴趣的像素 所以 我想忽略它们 我只是想问一下我所遵循的方法是否可以接受 我已为这些像素分配了负值 这样可以接受吗 当像素具有负值时意味着什么 它会在图像上有一些表现吗 如果您的数据类型允许 例如有符号整数
  • 如何判断无扩展名图像是 png 还是 jpeg

    不久前 我保存了一些由网络服务生成的图像 因此文件名例如 ysauyft87ggsa67fgeg w 1600 我可以打开并操作这些图像 好的 我只想知道它们是什么编码 几乎可以肯定是 png 或 jpeg 我已经在 OSX 中尝试过 获取
  • Chrome 在来自第 3 方 IFRAME 时不会保留我的 _SESSION 变量,但在直接访问时可以完美运行

    直到几周后 我所有的网站都运行良好 我编写代码并在 CodeCanyon 上出售 但最近 今天 我注意到我无法再登录我在那里出售的 PHP 小代码片段 如果我直接在我的域上工作 就像在 URL 栏中输入链接一样 那么在任何浏览器中一切都会完
  • 在Python中使用numpy和scipy在matplotlib中制作分箱箱线图

    我有一个包含值对的二维数组 我想通过 x 值的不同箱来绘制 y 值的箱线图 IE 如果数组是 my array array 1 40 5 4 5 60 然后我想对 my array 0 进行分箱 然后对于每个分箱 生成属于每个框中的相应 m
  • 语法错误:WITH 在此位置输入无效

    所以我有这个类似的请求 WITH customers in usa AS SELECT customerName state FROM customers WHERE country USA SELECT customerName FROM
  • 查找字符串中重复的单词并计算重复次数

    我需要找到字符串上重复的单词 然后计算它们重复的次数 基本上 如果输入字符串是这样的 String s House House House Dog Dog Dog Dog 我需要创建一个不重复的新字符串列表 并将每个单词的重复次数保存在其他
  • 更改 viewpager 中当前片段的背景图像

    我在 viewpager 中有 4 个片段 FragmentStatePagerAdapter 在我的 viewpager 所在的活动中 FragmentStatePagerAdapter 的 newInstance 方法将布局 id 作为
  • Quarkus & Microprofile:是否有更好的方法将 application.properties 中的属性使用到 @ClientHeaderParam 中?

    我正在尝试构建一个简单的应用程序来调用 APIquarkus rest client 我必须注入一个 API 密钥作为标头 该标头对于 API 的所有资源都是相同的 所以我想把这个API Key的值 这取决于环境 dev qa prod 在
  • 将焦点设置回文本框

    在用户移动到用户表单上的下一个字段之前 我需要检查文本框是否为空 空或空白 这是检查文本框是否为空 null 空白的代码 我的问题是它不会将焦点返回到文本框 而是移动到用户表单中的下一个字段 Private Sub txtTDYLocati
  • 3 层模式与 MVVM 的比较

    我不知道MVVM 我总是遵循 3 层模式 其中一层是 UI 另一层是业务层 最后一层是数据访问层 在这一层中 我们将请求从 UI 发送到业务层 业务层与数据访问层进行交互 在这种模式下 一切都很顺利 那么我的问题是为什么要学习 MVVM M