才学疏浅,请勿喷,如果有理解不对的地方请留言

其实,每个小小的程序员都有个毛病,就是反复写一个东西会觉得这个东西没有新意。

就像让你写三层,你却还是觉得想写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和传统三层的理解的更多相关文章

  1. Rafy 领域实体框架示例(1) - 转换传统三层应用程序

    Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...

  2. .NET应用架构设计—面向查询的领域驱动设计实践(调整传统三层架构,外加维护型的业务开关)

    阅读目录: 1.背景介绍 2.在业务层中加入核心领域模型(引入DomainModel,让逻辑.数据有家可归,变成一个完整的业务对象) 3.统一协调层Application Layer(加入协调层来转换 ...

  3. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  4. mvc/mvvm小小的总结

    mvc/mvvm 阮大神博客 mvc 分为三层,其实M层是数据模型层,它是真正的后端数据在前端js中的一个映射模型,他们的关系是:数据模型层和视图层有映射关系,model改变,view展示也会更改,当 ...

  5. MVC项目实践,在三层架构下实现SportsStore-11,使用Knockout实现增删改查

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  6. 【extjs6学习笔记】1.2 初始:MVC MVVM

    模型 这表示数据层.该模型可以包含数据验证和逻辑来保持数据.在 ext js 中, 大多数模型都与一个数据存储一起使用. 视图 这表示用户界面. 是用户在屏幕上看到的组件. 在每次互动的用户与应用程序 ...

  7. MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

随机推荐

  1. mysql悲观锁以及乐观锁总结和实践

    悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实现,往往 ...

  2. python print和strip

    在使用这两个模块时犯过错误,总结如下: 1.print print在打印时会自动加上换行,例如: >>> for i in xrange(1,5): ... print i ... ...

  3. 01_HBase概述

    1. HBase在Hadoop生态圈中的位置 问题:HBase 是什么,用在哪里,解决什么样的问题? 解答: 1)简单来说, HBase 是一种类似于面向列的分布式数据库(集群), 底层利用HDFS ...

  4. ThinkPHP的URL重写时遇到No input file specified的解决方法

    因为在Fastcgi模式下,php不支持rewrite的目标网址的PATH_INFO的解析 ThinkPHP运行在URL_MODEL=2时,会出现 No input file specified.的情 ...

  5. linux ps 命令参数详解

    -a 显示所有终端机下执行的进程,除了阶段作业领导者之外. a 显示现行终端机下的所有进程,包括其他用户的进程. -A 显示所有进程. -c 显示CLS和PRI栏位. c 列出进程时,显示每个进程真正 ...

  6. byte[]与各种数据类型互相转换示例

    public class TestCase { /** * short到字节数组的转换. */ public static byte[] shortToByte(short number) { int ...

  7. python爬虫之下载京东页面图片

    import requests from bs4 import BeautifulSoup import time import re t = 0 #用于给图片命名 for i in range(10 ...

  8. POJ 1160 经典区间dp/四边形优化

    链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...

  9. firefox与ie 的javascript区别

    1. Document.form.item 问题     现有问题: 现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 ...

  10. CF910B

    题解: dp f[i][j]表示i根a,j根b要多少 然后随便转移一下 代码: #include<bits/stdc++.h> using namespace std; ][],n,a,b ...