zoukankan      html  css  js  c++  java
  • 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而出现的

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/myselfyourself/p/7284250.html
Copyright © 2011-2022 走看看