MVC还是MVVM?或许VMVC更适合WinForm客户端
2016-12-09 10:30
337 查看
最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』。相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的C/S架构的系统。事实上,作为企业信息管理系统,包括ERP/CRM/SCM等,桌面客户端还是很OK的。
这次重构原定的目标有两个:
1、客户端还是WinForm不变,但使用MVC模式重写;
2、WCF改成WebAPI。
经过2周时间的尝试和探索,重构计划变更为:
1、使用VMVC模式来重构WinForm客户端;
2、用WCF实现伪WebAPI,其本质还是个WCF服务,但实现了RESTful风格的WebAPI。
这次和大家分享我对客户端架构的一些探索,就不展开服务端相关的话题了。那么,什么是VMVC呢?呵呵,这个是我发明的新名称,和MVC的区别在于用ViewModel替换了Model。ViewModel和View之间实现双向数据绑定,View上面的交互产生的操作指令,还是由Controller接收,然后通过对ViewModel的操作,更新View的数据。
简单地说,就是ViewModel负责数据流,View负责显示和接受用户指令,而Controller则居中调度。示意图如下:
View Code
这次重构原定的目标有两个:
1、客户端还是WinForm不变,但使用MVC模式重写;
2、WCF改成WebAPI。
经过2周时间的尝试和探索,重构计划变更为:
1、使用VMVC模式来重构WinForm客户端;
2、用WCF实现伪WebAPI,其本质还是个WCF服务,但实现了RESTful风格的WebAPI。
这次和大家分享我对客户端架构的一些探索,就不展开服务端相关的话题了。那么,什么是VMVC呢?呵呵,这个是我发明的新名称,和MVC的区别在于用ViewModel替换了Model。ViewModel和View之间实现双向数据绑定,View上面的交互产生的操作指令,还是由Controller接收,然后通过对ViewModel的操作,更新View的数据。
简单地说,就是ViewModel负责数据流,View负责显示和接受用户指令,而Controller则居中调度。示意图如下:
1 using System; 2 using System.Windows.Forms; 3 using Insight.Utils.Client; 4 using Insight.Utils.Common; 5 using Insight.WS.Client.Common.Utils; 6 using Insight.WS.Client.MainApp.Views; 7 8 namespace Insight.WS.Client.MainApp.Models 9 { 10 public class SetModel 11 { 12 public LoginSet View = new LoginSet(); 13 14 private string _Address = Config.BaseAddress(); 15 private string _Port = Config.Port(); 16 private bool _SaveUser = Config.IsSaveUserInfo(); 17 18 /// <summary> 19 /// 构造方法,初始化控件初始值 20 /// 通过订阅事件实现双向数据绑定 21 /// </summary> 22 public SetModel() 23 { 24 View.AddressInput.EditValueChanged += AddressChanged; 25 View.AddressInput.Text = _Address; 26 27 View.PortInput.EditValueChanged += PortChanged; 28 View.PortInput.Text = _Port; 29 30 View.SaveUserCheckBox.CheckStateChanged += SaveUserChanged; 31 View.SaveUserCheckBox.Checked = _SaveUser; 32 } 33 34 /// <summary> 35 /// 显示对话框 36 /// </summary> 37 public void ShowDialog() 38 { 39 View.ShowDialog(); 40 } 41 42 /// <summary> 43 /// 关闭对话框 44 /// </summary> 45 public void Close() 46 { 47 View.DialogResult = DialogResult.OK; 48 View.Close(); 49 } 50 51 /// <summary> 52 /// 测试服务器连通性 53 /// </summary> 54 /// <returns>bool 是否通过连通性测试</returns> 55 public bool Test() 56 { 57 var url = $"http://{_Address}:{_Port}/commonapi/v1.0/test"; 58 var result = new HttpClient(url).Request(Params.Token); 59 if (result.Code != "400") return true; 60 61 Messages.ShowError("请配置正确的服务器地址和端口号!"); 62 return false; 63 } 64 65 /// <summary> 66 /// 保存设置 67 /// </summary> 68 public void Save() 69 { 70 if (!_SaveUser) Config.SaveUserName(string.Empty); 71 72 Config.SaveIsSaveUserInfo(_SaveUser); 73 Config.SaveAddress(_Address, _Port); 74 75 Params.InsightServer = $"http://{_Address}:{_Port}"; 76 } 77 78 /// <summary> 79 /// 服务器地址发生变化 80 /// </summary> 81 /// <param name="sender"></param> 82 /// <param name="e"></param> 83 private void AddressChanged(object sender, EventArgs e) 84 { 85 _Address = View.AddressInput.Text; 86 } 87 88 /// <summary> 89 /// 服务端口发生变化 90 /// </summary> 91 /// <param name="sender"></param> 92 /// <param name="e"></param> 93 private void PortChanged(object sender, EventArgs e) 94 { 95 _Port = View.PortInput.Text; 96 } 97 98 /// <summary> 99 /// 保存用户账号选项发生变化 100 /// </summary> 101 /// <param name="sender"></param> 102 /// <param name="e"></param> 103 private void SaveUserChanged(object sender, EventArgs e) 104 { 105 _SaveUser = View.SaveUserCheckBox.Checked; 106 } 107 } 108 }
View Code
相关文章推荐
- 用MVC做WinForm客户端
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
- android是mvc还是mvvm架构?
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
- Angular是MVC还是MVVM
- 细说MVC、桌面客户端应用软件和WPF
- 浅谈MVC、MVP、MVVM的区别
- [置顶] Android APP架构设计——MVC、MVP和MVVM介绍
- 【Android】【设计】Android 框架 MVC,MVP,MVVM
- [ExtJS5学习笔记]第九节 Extjs5的mvc与mvvm框架结构简介
- 最近在看socket连接,学习了一点适合新手学习,socket客户端和服务端长连接,废话就不多说了,大家看了就明白了
- winform 客户端调用SoapExtension的方法
- 错误提示:Asp.Net Mvc框架下 从客户端检测到有潜在危险的Request.Form值
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- 选择恐惧症的福音!教你认清MVC,MVP和MVVM
- 被误解的MVC和被神化的MVVM
- MVC,MVP 和 MVVM 的大致概念。
- MVC客户端使用 Mustache.js把json数据填充到模版中
- HTML、Swing还是XML,Java客户端工具选择?(四)