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 BB.class 中文乱码
    如何新建git仓库并连接以及git branch相关命令
    String、StringBuffer与StringBuilder区别
    HTML选择器
    java中的system.out.println()和JSP中out.println()区别
    校园双选会,你都懂么
    android visible invisible和gone的区别
    Android 显示意图和隐式意图的区别
    android doGet和doPost
    Android 监听SMS短信
  • 原文地址:https://www.cnblogs.com/myselfyourself/p/7284250.html
Copyright © 2011-2022 走看看