zoukankan      html  css  js  c++  java
  • 浅谈ViewModel和DTO

    前言

    记得刚工作的时候在项目中看到很多DTO的声明和定义,当时不太明白Dto和ViewModel的区别,随着工作经验的增加,再回首,偶有新感悟,写下随笔,算是对当时自己疑问的回应。

    正文

    DTO

    Data Transfer Object 数据传输对象
    DTO常见于接口输入参数,可以看做是接口传入参数的封装对象,同时参数中和数据库实体模型有一部分交集;比如需要提供一个用于修改一个学生类的姓名的API,那就可以定义一个StudentDTO,里面封装一个主键字段和姓名字段,将此DTO作为接口的传入参数。在比较简单的操作中,封装DTO体现不出优势(传入参数超过3个时,就要考虑封装成类,增加代码可读性),但是当项目代码达到一定规模后,封装DTO可以规范代码的结构,便于项目的维护。

    ViewModel

    视图模型
    ViewModel 常见于MVC中 Contoller 返回的实体模型的命名。是对返回的数据库实体模型的封装,同时属性和数据库实体模型有一部分交集。其思想是为了封装接口暴露的对象,很像数据库开发中视图的使用场景。避免暴露部分字段,只提供需要的部分。

        public abstract class Entity
        {
            public DateTime? CreateTime { get; set; }
            public DateTime? UpdateTime { get; set; }
            public bool IsSoftDeleted {get;set;}
        }
        
        [Table("Student")]
        public class Student:Entity
        {
            public virtual string StuNo { get; set; }
            public virtual string Name { get; set; }
        }
    
        [Table("Class")]
        public class Classes:Entity
        {
            public virtual string ClassNo { get; set; }
            public virtual string Name { get; set; }
        }
    
        public class StudentViewModel
        {
            public string StuNo { get; set; }
            public string Name { get; set; }
    
     
        }
    
        public class ClassesViewModel
        {
            public string ClassNo { get; set; }
            public string Name { get; set; }
    
            public List<StudentViewModel> Students { get; set; }
    
            public ClassesViewModel()
            {
                Students = new List<StudentViewModel>();
            }
        }
    

    通过这种方式的封装,使代码和架构设计更规范。但这样在引入了ORM的项目中会带来一个问题,就是数据库基类定义的公共方法比如Get SelectById(TPrimaryKey id)方法拿到的是Entity Model而非ViewModel,由Entity向DTO/ViewModel转化需要用代码处理,当业务代码足够多或者Entity的字段很多的时候,这个转化的代码带来的工作量是很大的并且不好维护。这时候就引入了OOM(Object-Object-Mapping)框架,通过OOM框架提供的功能可以省去转化的逻辑代码,从而减少重复的工作量

    结语

    以上就是我关于DTO和ViewModel的理解,如有不对还请看官指正,以免误人子弟。

  • 相关阅读:
    【前端进阶】VUE高性能组件引用
    「前端进阶」高性能渲染十万条数据(虚拟列表) (自己修改版本)
    页面缓存、离线存储技术localforage(案例篇)
    页面缓存、离线存储技术localforage(介绍篇)
    websocket快速搭建(node+websocket)
    一款程序员的杀手级应用:TabNine代码补全工具
    如何把es6的代码转成es5,ECMAScript 2015+代码转换神器——Babel
    如何使用echarts画一个简单k线图
    深入浅出理解 . 深拷贝 . 浅拷贝
    JS高级一看就懂什么是原型链
  • 原文地址:https://www.cnblogs.com/Mxy-cnblog/p/14943922.html
Copyright © 2011-2022 走看看