MVC MVVM和传统三层的理解
才学疏浅,请勿喷,如果有理解不对的地方请留言
其实,每个小小的程序员都有个毛病,就是反复写一个东西会觉得这个东西没有新意。
就像让你写三层,你却还是觉得想写MVC模式。
软件小公司做B/S的大部分还是在用三层,大公司可能有自己产品的传统行业的还是在用这个。
这时候你在想,三层这种模式我已经写腻了,我想写MVC。
三层和mvc不属于同样层面的东西,这只是对写法的一个概论而已。
MVC 和三层
拿WebForm的分离写法来说
现在流行Json交互
Mvc 三层
View UI
Controller 一般批处理页 ashx+BLL
Model Model+DAL
DB DB
其实这样对照你就不难发现
传统如果你写json分离的ajax写法,你会在页面的js中写一个请求get post的ajax 来对应一个或多个 一般批处理页面ashx 进行增删该查
即UI 到处理程序ashx ashx一般会调用BLL一些方法做一些处理再返回给UI
我们可以这样表达
即 UI=>ashx=>BLL
有没有发现这个很像MVC的View和Controller
即 View(UI)=>Controller(BLL+ashx)
其实json分离写法你写多了,其实你的ashx页面一般返回就是一个json数组,其实也可以理解成一个对象Model
你的View视图 返回的其实也是对象Model
其实有些时候你可能觉得我说的不对,MVC的Model应该是BLL和DAL,其实更多的时候控制器写业务逻辑比较多,因为你的页面的视图模型ViewModel往往是不能对应上页面上Model模型的
MVC的Model其实不能理解成三层的Model,他也包括一些DAL的操作在里面,也可以写BLL逻辑
三层
即 BLL=>DAL=>DB
MVC
即 Model(BLL+DAL+DB?)
Model比较复杂
细说一下
MVC这样理解也没有太大的问题,但是你会发现,这样还没有三层好,耦合度实在是太高了
而且MVC View需要的元素往往是不能对应骑数据库的元素的,我又不想在Controller写太多的业务逻辑
那么我们在想是不是应该 让页面 和 Model适配起来呢
于是诞生了ViewModel
ViewModel是一种典型适配器模式
MVVM
View=>Controller=>ViewModel=>Model=>DAL=>DB
对应三层
UI=>ashx=>BLL=>DAL=>DB
ViewModel主要是将数据库的模型映射成我们能用的视图模型
例如
/// <summary>/// 用户表/// </summary>public class User{/// <summary>/// 用户账号/// </summary>public string UserName { get; set; }/// <summary>/// 用户密码/// </summary>public string Password { get; set; }/// <summary>/// 删除用户/// </summary>/// <param name="Username"></param>/// <returns></returns>public bool DeleteUser(string Username){return false;}}
还有一张用户信息表UserInfo
/// <summary>/// 用户表/// </summary>public class UserInfo{/// <summary>/// 用户表id/// </summary>public int UserID { get; set; }/// <summary>/// 用户信息表id/// </summary>public int UserInfoID { get; set; }/// <summary>/// 用户姓名/// </summary>public string Name { get; set; }/// <summary>/// 用户年龄/// </summary>public string Age { get; set; }/// <summary>/// 删除用户信息/// </summary>/// <param name="Username"></param>/// <returns></returns>public bool DeleteUserInfo(int ID){return true;}}
这时候一个cshtml页面问你要一个 用户的基本资料,你该怎么办,因为他只能返回一个模型
其实你在想用一个大的Class包含这两个就是了
答案就是
public class UserViewModel{public User User { get; set; }public UserInfo UserInfo { get; set; }public UserViewModel(){this.User = new Models.User();this.UserInfo = new Models.UserInfo();}/// <summary>/// 删除方法/// </summary>/// <param name="ID"></param>/// <returns></returns>public bool Delete(int ID){bool isFlag = false;User.DeleteUser(ID);UserInfo.DeleteUserInfo(ID);return isFlag;}}
这是不是很像数据库视图,多表,其实ViewModel大概也是这么个意思
ViewModel 来和Model做交互,Model包含Model(三层的)和DAL(三层的),我们在MVC的文件夹下建立一个DAL来交互DB
其实这就是所谓那种高端的MVVM模式
其实就是一种为了解决实际问题MVC的一种变种而已
MVVM 可以说ViewModel实际上为了解决View而出现的
转载于:https://www.cnblogs.com/myselfyourself/p/7284250.html
MVC MVVM和传统三层的理解相关推荐
- MVC与三层架构理解
文章目录 1. JSP的发展 2. MVC思想 优缺点 3. 三层架构 为什么使用三层 三层优缺点 4. MVC与三层架构的区别 1. JSP的发展 早期只有Servlet,只能使用response输 ...
- 项目架构之传统三层架构和领域模型三层架构
一.架构之传统三层架构 传统三层架构是一种软件架构,是一种典型的.基于贫血模型的.面向过程的JavaWeb分层方式.该架构分为以下三个层次: 数据访问层(DAL - Data Access Layer ...
- 前端框架MVC/MVVM分析系列
Backbone Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代 ...
- JavaEE架构之传统三层架构,集群架构,分布式架构,微服务架构
javaEE架构 1.传统三层架构(all in one项目) 传统三层架构大致可以分为表现层,业务层和持久层(数据访问层).其中表现层负责接受请求和转发请求.业务层负责处理请求(注:事务管理,日志记 ...
- mvc mvvm mvp_mvc vs mvp vs mvvm
mvc mvvm mvp 思想程序员(Thought Programmer) Nowadays we have many options when it comes to architecture d ...
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- 谈谈我对MVC的View层实现的理解
谈谈我对MVC的View层实现的理解 MVC框架可以把应用清晰明了地分为三个部分:Model层–数据层,View层–视图层,Controller–逻辑层,Model层负责整合数据,View层负责页面渲 ...
- 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园
我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园
- MVC项目实践,在三层架构下实现SportsStore-06,实现购物车
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
最新文章
- 使用rancher对Docker容器服务升级
- Ubantu下hadoop运行第一个例子wordcount过程
- ThreadLocalRandom 安全吗
- ubuntu安装wkhtmltopdf
- sklearn自学指南(part17)--稳健回归-异常值和建模误差
- android webview点击返回键返回上一页
- ubuntu 14.04 登录 界面 root
- Vmware下安装CentOS6的特别注意,一定要在虚拟机上电时候按DEL,选择操作系统启动方式...
- python求完全平方数_【Python】【demo实验6】【练习实例】【完全平方数相关】
- ffmpeg 编译成功,Mark一下
- 【王道计组笔记】总线(3):总线仲裁的基本概念
- 用matlab进行边缘检测,利用MATLAB进行数字图像的边缘检测
- Spring、SpringMVC、SpringBoot、SpringCloud概述
- JSON如何序列图片
- Adobe官方清理工具Adobe Creative Cloud Cleaner Tool使用教程
- Java 金额转换 阿拉伯数字金额转换成汉字大写金额
- 首先实现储存程序的电子数字计算机是什么,世界上首先实现存储程序的电子计算机是什么...
- 麦子学院C++学习笔记
- Adobe Acrobat的安装时出现:服务print spooler启动失败,请确认您有足够权限启动系,打印机print spooler系统服务不能正常启用解决办法
- 求可以进行图片抽签的小程序