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而出现的
MVC MVVM和传统三层的理解的更多相关文章
- Rafy 领域实体框架示例(1) - 转换传统三层应用程序
Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...
- .NET应用架构设计—面向查询的领域驱动设计实践(调整传统三层架构,外加维护型的业务开关)
阅读目录: 1.背景介绍 2.在业务层中加入核心领域模型(引入DomainModel,让逻辑.数据有家可归,变成一个完整的业务对象) 3.统一协调层Application Layer(加入协调层来转换 ...
- MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...
- mvc/mvvm小小的总结
mvc/mvvm 阮大神博客 mvc 分为三层,其实M层是数据模型层,它是真正的后端数据在前端js中的一个映射模型,他们的关系是:数据模型层和视图层有映射关系,model改变,view展示也会更改,当 ...
- MVC项目实践,在三层架构下实现SportsStore-11,使用Knockout实现增删改查
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- 【extjs6学习笔记】1.2 初始:MVC MVVM
模型 这表示数据层.该模型可以包含数据验证和逻辑来保持数据.在 ext js 中, 大多数模型都与一个数据存储一起使用. 视图 这表示用户界面. 是用户在屏幕上看到的组件. 在每次互动的用户与应用程序 ...
- MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
随机推荐
- .Net HttpClient form-data格式请求
var multipartFormDataContent = new MultipartFormDataContent(); multipartFormDataContent.Add(new Stri ...
- Java循环语句之 while
生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 Java 中实现功能时,也经常需要重复执行某些代码,例如,我们为了表示 ...
- C4 文件和目录:APUE 笔记
C4: 文件和目录 本章主要讨论stat函数及其返回信息,通过修改stat结构字段,了解文件属性. struct stat结构定义如下: struct stat { __dev_t st_dev; / ...
- js打乱数组的实战应用
文章首发于: https://www.xiabingbao.com/post/javascript/js-random-array.html 在js中,能把数组随机打乱的方法有很多,每个方法都有自己的 ...
- Tomcat服务部署步骤
Tomcat服务部署步骤 1. 2. 3. tar -zxvf apache-tomcat-7.0.68.tar.gz,然后修改文件夹名称为需要的名称, 使用mv命令 4. 删除 /webapps/R ...
- 真正在线编辑的在线web编辑器
最近正在研究开发一款在线web编辑器架构,这是一款真正傻瓜式的web编辑器,可以在正常浏览页面的情况进行编辑,经过测试,对于一般网页页面来说非常好用方便,操作更简单. 一般的在线web编辑器虽说提供了 ...
- Spring3.0 核心jar包详解
org.springframework.aop 包含在应用中使用Spring的AOP特性时所需的类. org.springframework.asm Spring独立的ASM程序, Spring ...
- (转载)设置环境变量永久生效和临时生效 export PS1
source/etc/profile是让/etc/profile文件修改后立即生效, 还有一种方法是:. /etc/profile 注意:.和/etc/profile有空格 linux中source命 ...
- vue结合element-ui 的select 全选问题
下拉列表多选 问题 通过操作 所有来进行全选 全不选问题 element-ui 中 select 记录下自己最近使用element-ui 中的 select多选问题 在element中默认是指单纯多选 ...
- 转载:【Oracle 集群】RAC知识图文详细教程(一)--集群概念介绍
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...