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而出现的