• 浅谈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的理解,如有不对还请看官指正,以免误人子弟。

  • 相关阅读:
    [改善Java代码]使用构造块精炼程序
    [改善Java代码]若有必要,使用变长数组
    [改善Java代码]警惕数组的浅拷贝
    [改善Java代码]在明确的场景下,为集合指定初始容量
    [改善Java代码] 枚举项数量限定为64个以内
    [改善Java代码]多种最值算法,适时选择
    [改善Java代码]推荐使用枚举定义常量
    [改善Java代码]性能考虑,数组是首选
    [改善Java代码]用偶判断,不用奇判断
    [改善Java代码]break万万不可忘
  • 原文地址:https://www.cnblogs.com/Mxy-cnblog/p/14943922.html
Copyright © 2020-2023  润新知