【进阶编程】MVC和MVVM实现前后端分离的实现
在 WPF 开发中,通常使用 MVVM(Model-View-ViewModel)架构来分离视图和业务逻辑,但在某些情况下,你可能希望将 MVC(Model-View-Controller)模式与 MVVM 结合使用。这种结合有时是为了兼顾不同的架构优势,尤其是在大型应用程序中,或者当你在 WPF 中同时使用 Web 或 ASP.NET Core 后端时。
MVC 和 MVVM 结合的场景
MVC 是一种广泛用于 Web 开发的架构模式,主要通过 Controller 来协调 Model 和 View,而 MVVM 是 WPF 中的推荐模式。在某些应用中,你可能需要以下两种模式的结合:
- Web API/后端使用 MVC:如果你的应用涉及到 Web 服务或后端业务逻辑层,通常你会使用 MVC 模式来管理 API 请求、处理逻辑并返回视图。
- 前端使用 MVVM:WPF 前端通常使用 MVVM 模式来分离界面和逻辑,控制视图与数据的交互。
如何结合 MVC 和 MVVM
结合 MVC 和 MVVM 主要通过以下方式进行:
-
使用 MVC 处理后端业务和数据:
- 在后端部分,你使用 MVC 模式来处理数据库交互、API 请求和数据管理。
- 前端通过调用后端接口或 Web API 来获取数据,数据从 Model(或 Web API)传递到 ViewModel。
-
在 WPF 中使用 MVVM 处理界面和交互:
- 在前端的 WPF 应用中,你使用 MVVM 模式管理视图和视图模型,确保业务逻辑和 UI 逻辑解耦。
- Controller 的角色可以被 ViewModel 取代,ViewModel 负责与后端进行通信,接收数据并将其展示在视图中。
结合 MVC 和 MVVM 的具体示例
后端部分:MVC 模式
假设我们有一个后端 API,使用 ASP.NET Core MVC 处理客户数据。
1. 创建一个 Model 类:
public class Customer
{public int Id { get; set; }public string Name { get; set; }public string Email { get; set; }
}
2. 创建一个 Controller 类:
using Microsoft.AspNetCore.Mvc;[ApiController]
[Route("api/[controller]")]
public class CustomerController : ControllerBase
{// 模拟数据存储private static List<Customer> customers = new List<Customer>{new Customer { Id = 1, Name = "Alice", Email = "alice@example.com" },new Customer { Id = 2, Name = "Bob", Email = "bob@example.com" }};[HttpGet]public IEnumerable<Customer> GetCustomers(){return customers;}[HttpGet("{id}")]public ActionResult<Customer> GetCustomer(int id){var customer = customers.FirstOrDefault(c => c.Id == id);if (customer == null) return NotFound();return customer;}
}
在这个控制器中,GetCustomers 和 GetCustomer 方法分别返回所有客户和单个客户的信息。
前端部分:MVVM 模式
在 WPF 前端中,我们使用 MVVM 模式来展示从后端 API 获取的数据。
1. 创建 Customer Model 类:
public class Customer
{public int Id { get; set; }public string Name { get; set; }public string Email { get; set; }
}
2. 创建 ViewModel 类:
using System.Collections.ObjectModel;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;public class MainViewModel : INotifyPropertyChanged
{private ObservableCollection<Customer> _customers;private bool _isLoading;public ObservableCollection<Customer> Customers{get { return _customers; }set{_customers = value;OnPropertyChanged(nameof(Customers));}}public bool IsLoading{get { return _isLoading; }set{_isLoading = value;OnPropertyChanged(nameof(IsLoading));}}public MainViewModel(){Customers = new ObservableCollection<Customer>();LoadCustomers();}private async void LoadCustomers(){IsLoading = true;using (var client = new HttpClient()){client.BaseAddress = new Uri("https://yourapiurl/api/");var response = await client.GetStringAsync("customer");var customers = JsonConvert.DeserializeObject<List<Customer>>(response);foreach (var customer in customers){Customers.Add(customer);}}IsLoading = false;}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
在 MainViewModel 中,我们从后端 API 获取客户数据,并将其填充到 ObservableCollection<Customer> 中。我们使用 HttpClient 来发送 GET 请求,并使用 JsonConvert 反序列化返回的 JSON 数据。
3. 创建 XAML 界面:
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MVVM with MVC Example" Height="350" Width="525"><Window.DataContext><local:MainViewModel /></Window.DataContext><Grid><ProgressBar Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}}"HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="25" /><ListBox ItemsSource="{Binding Customers}" HorizontalAlignment="Left" Height="200" VerticalAlignment="Top" Width="200"><ListBox.ItemTemplate><DataTemplate><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Email}" /></StackPanel></DataTemplate></ListBox.ItemTemplate></ListBox></Grid>
</Window>
在 XAML 中,我们使用数据绑定将 ListBox 的 ItemsSource 绑定到 MainViewModel 中的 Customers 属性,并通过 BooleanToVisibilityConverter 显示/隐藏进度条。
4. 总结:MVC 和 MVVM 结合的优势
将 MVC 和 MVVM 结合的优势体现在:
- MVC 适用于后端控制,管理数据库和业务逻辑,处理请求和返回数据。
- MVVM 适用于前端 UI 逻辑,确保视图和业务逻辑解耦,并提供更加灵活的 UI 更新机制。
- 使用 Web API 和 HttpClient,可以轻松地将前端 MVVM 与后端 MVC 进行结合,使得两者之间的通信更加清晰和结构化。
这种结合特别适合于以下场景:
- 前后端分离的应用程序,其中后端使用 MVC 处理 API,前端使用 MVVM 来处理 WPF 用户界面。
- 需要将前端 WPF 应用与 Web API 连接的场景,保持了前端和后端的分离。
- 增强了应用的可维护性和可测试性,MVVM 使得前端更易于单元测试,MVC 使得后端更易于管理。
如果你有更多问题,随时可以提问!
相关文章:
【进阶编程】MVC和MVVM实现前后端分离的实现
在 WPF 开发中,通常使用 MVVM(Model-View-ViewModel)架构来分离视图和业务逻辑,但在某些情况下,你可能希望将 MVC(Model-View-Controller)模式与 MVVM 结合使用。这种结合有时是为了兼顾不同的架…...
HT81297 18W内置升压单声道D类音频功放
1、特征 扩频技术 输出功率 18W(VBAT3.7V, RL4Ω, THDN10%, fN 1kHz) 16W(VBAT3.7V,RL-4Ω,THDN1%,fN1kHz) 8W(VBAT3.3V,RL-8Ω,THDN1%, fN1kHz) VBAr供电范围:3.0V至12V 高效H类升压功能 -自适应功放功率的升压轨,延长电池播放时间 (HT81297A) -可调节最大限流值&…...
linux ipmitool配置机器的BMC(服务器管理后台)
前置:mgnt口和网卡1连接入内网,并分配静态ip 1. 安装 ipmitool Debian/Ubuntu: sudo apt-get update sudo apt-get install ipmitool CentOS/RHEL: sudo yum install ipmitool2. 配置 BMC 的 IP 地址 #打印当前ipmi 地址配置信息。 ipmitool lan p…...
【项目实战】location.href 实现文件下载
应用场景 最近在项目中看到一种新的文件下载方式,原理是将[后台地址接口地址请求参数]拼接成一个url,直接将下载任务丢给浏览器去执行.但是在需要校验token的项目中,需要后台单独给这个接口放开token校验 location.href 相关内容 window.location.protocol: 返回当前 URL 的…...
【Threejs】从零开始(十)--加载gltf模型和压缩后的模型
一.加载普通的gltf模型 glTF(gl传输格式)是一种开放格式的规范 (open format specification), 用于更高效地传输、加载3D内容。该类文件以JSON(.gltf)格式或二进制(.glb)…...
国标GB28181平台EasyGBS在安防视频监控中的信号传输(电源/视频/音频)特性及差异
在现代安防视频监控系统中,国标GB28181协议作为公共安全视频监控联网系统的国家标准,该协议不仅规范了视频监控系统的信息传输、交换和控制技术要求,还为不同厂商设备之间的互联互通提供了统一的框架。EasyGBS平台基于GB28181协议,…...
Day9 神经网络的偏导数基础
多变量函数与神经网络 在神经网络中,我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如,一个简单的神经元输出可以表示为: z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…...
day4:tomcat—maven-jdk
一,java项目部署过程 编译:使用javac命令将.java源文件编译成.class宇节码文件打包:使用工具如maven或Gradle将项目的依赖、资源和编译后的字节码打包成一个分发格式,如.jar文件,或者.war文件(用于web应用)…...
apache-tomcat-6.0.44.exe Win10
apache-tomcat-6.0.44.exe Win10...
Redis(2)常用命令
安装Redis 现在我们安装Redis 5,Redis安装在Linux上面安装,如果想在本机上面安装多个Redis的话,就要使用Docker。 在Ubuntu上面安装: 切换到root用户使用apt命令搜索相关的软件包(apt search redis)apt …...
【原生js案例】ajax的简易封装实现后端数据交互
ajax是前端与后端数据库进行交互的最基础的工具,第三方的工具库比如jquery,axios都有对ajax进行第二次的封装,fecth是浏览器原生自带的功能,但是它与ajax还是有区别的,总结如下: ajax与fetch对比 实现效果 代码实现 …...
安卓环境配置及打开新项目教程,2024年12月20日最新版
1.去官网下载最新的Android Studio,网址:https://developer.android.com/studio?hlzh-cn 2.下载加速器,注册账号,开启加速器。网址:放在文末。 3.下载安卓代码,项目的路径上不能有中文,特别是…...
Docker 安装 禅道-21.2版本-外部数据库模式
Docker 安装系列 1、拉取最新版本(zentao 21.2) [rootTseng ~]# docker pull hub.zentao.net/app/zentao Using default tag: latest latest: Pulling from app/zentao 55ab1b300d4b: Pull complete 6b5749e5ef1d: Pull complete bdccb03403c1: Pul…...
写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践
自OceanBase 4.3.3版本推出以来,向量检索的能力受到了很多客户的关注,也纷纷表达希望OB能拓展更多 多模数据库大模型 的AI应用实践。 在上篇文章 👉 OceanBase LLM,免费构建你的专属 AI 助手 ,我们介绍了如何去搭建一…...
数据分析实战—鸢尾花数据分类
1.实战内容 (1) 加载鸢尾花数据集(iris.txt)并存到iris_df中,使用seaborn.lmplot寻找class(种类)项中的异常值,其他异常值也同时处理 。 import pandas as pd from sklearn.datasets import load_iris pd.set_option(display.max_columns, N…...
【专题】2024抖音电商母婴行业分析报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38651 在数字化浪潮的席卷下,抖音电商母婴行业正经历着深刻变革。当下,年轻一代父母崛起,特别是 24 至 30 岁以及 18 至 23 岁的群体成为抖音母婴行业兴趣人群的主力军。他们带来全新育儿理念&…...
堆栈粉碎的原理与预防攻击措施
1、堆栈粉碎的原理 “堆栈粉碎”(stack smashing)指的是在计算机程序中利用缓冲区溢出漏洞来修改或破坏函数调用栈的过程。以下是其基本原理: 缓冲区溢出:当程序接收输入数据时,如果没有适当的边界检查和验证&#x…...
Flutter组件————AppBar
AppBar 是 Flutter 中用于创建应用程序顶部栏的组件,它遵循 Material Design 规范。 参数: 参数名称类型描述titleWidget设置 AppBar 中的标题文本或自定义标题小部件。automaticallyImplyLeadingbool决定是否自动添加返回按钮(如果页面不是…...
请问深度学习直接缝了别的模型,在论文中这种创新点应该如何描述呢?
作者:星辰 链接:https://www.zhihu.com/question/599461738/answer/3289126344 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作为散养硕士,我们希望能早早发小论文,…...
微流控专题 | 微流体应用说明——藻酸盐微球生产简介
基于水凝胶的递送系统正被越来越多地应用于各个领域,包括封装、保护以及在制药、保健品、食品工业中释放生物活性物质,还用于细胞/细菌/微生物的培养与植入,以及生物研究中基于细胞的基因操作。 尺寸在 50m 范围内的高度单分散的藻酸盐微球 —…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
