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