Dto数据传输对象

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: Dto数据传输对象

数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。

为什么要使用对象传输模型?

  1. 可以跨平台、存在多平台的字符类型不一致
  2. 数据安全容易解耦
  3. 领域模型带有业务
  4. 效率更好

Dto和视图模型(ViewModel)有什么区别:

仔细思考

  1. 在数据库存储性别字段Sex中,0代表男,1代表女,我们可以在后台渲染前端直接显示男女,两个都可以实现没有什么区别
  2. 但是如果你有PC端,移动端,小程序,让它显示英文man、先生、女士等等,显示其他含义,这个时候Dto就支持个性化了。

说完这些你可能还是不懂Dto到底是干什么用的

多种模型概论

  1. BO-BO(business object) 业务对象-主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象
  2. DAO-DAO(data access object) 数据访问对象(直接访问数据库)
  3. DO-DO(Domain Object)领域对象
  4. DTO-DTO(Data Transfer Object)数据传输对象
  5. PO-PO(persistant object) 持久对象-从db拿出来的展示数据,没有操作
  6. POCO-POCO(Plain Old CLR Object) 简单无规则 CLR 对象(POCO是DO/DTO/BO/VO的统称)
  7. VO-VO(View Object) 视图对象-用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来,一个对象对应一个页面等等。

如何使用Dto

public class GoodsEntity//这是我们的实体类
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public DateTime? CreateTime { get; set; }
        public bool IsDeleted { get; set; }
        public List<Items> Items { get; set; }
        public BrandsEntity Brands { get; set; }
    }


先按照实体类定义一个Dto模型

public class GoodsDto
    {
        public string GoodsName { get; set; }
        public decimal Price { get; set; }
        public string CreateTime { get; set; }
        public string Content { get; set; }
        public bool IsDeleted { get; set; }
        public List<Items> Items { get; set; }
        public string BrandName { get; set; }
    }


因为我们页面上不需要展示id所以我去掉了,还有页面的属性名称不一样,但是Dto都包括在实体里面。使用automapper 映射:

  1. 首先安装依赖包AutoMapper.Extensions.Microsoft.DependencyInjection
  2. 然后在.net Core ConfigureServices中注入服务
services.AddAutoMapper(typeof(Startup));
  1. 最后定义一个AutoMapperConfigs.cs的类,该类提供AutoMapper规则配置的入口,它只提供一个静态的方法,在程序第一次运行的时候调用该方法完成配置。
public class AutoMapperConfigs
    {
        public static MapperConfiguration RegisterMappings()
        {
            return new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new GoodsProfile());
            });
        }
    }


都完成好了那该怎么样使用呢

GoodsProfile类继承了AutoMapper的Profile类

public class GoodsProfile : Profile
    {
        // 添加你的实体映射关系.
        public GoodsProfile()
        {
            // GoodsEntity转GoodsDto. 
            CreateMap<GoodsEntity, GoodsDto>()
                // 映射发生之前
                // 映射之前统一处理
                .BeforeMap((src, dest) => src.Price = src.Price + 10)
                // 默认赋值
                .BeforeMap((src, dest) => src.CreateTime = src.CreateTime == null ? (new DateTime(2012, 12, 12)) : src.CreateTime)
                // 映射匹配
                .ForMember(dest => dest.GoodsName, opt => opt.MapFrom(src => src.Name))
                .ForMember(dest => dest.CreateTime,
                    opt => opt.MapFrom(src => ((DateTime)src.CreateTime).ToString("yyyy-MM-dd")))
                // 匹配的过程中赋值
                .ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price + 10))
                // 忽略某个属性的映射
                .ForMember(dest => dest.IsDeleted, opt => opt.Ignore())
                // 合并
                .ForMember(dest => dest.GoodsName, opt => opt.MapFrom(src => src.Brands.Name +" "+ src.Name))
                // 映射发生之后
                .AfterMap((src, dest) => dest.GoodsName = dest.Price < 40 ? "N/A." : dest.GoodsName)
                .AfterMap((src, dest) => dest.Content = "数据传输对象(DTO)(DataTransfer Object)");
            // 最简单的匹配,属性字段/类型等完全一致
            // GoodsDto转GoodsEntity.
            CreateMap<GoodsDto, GoodsEntity>();
        }
    }


创建规则:

1.事前事后规则

我们获取到数据以后,时间为空,但是又不能展示到前端,这个时候在映射到前端之前对时间赋默认值。我们在获取金额以后,需要在打折或者加减

事前BeforeMap,我们操作的是源数据src=GoodsEntity

事后AfterMap,我们操作的是dest=GoodsDto

2.默认赋值ForMember

3.属性不一致匹配,我们的name和GoodsName不一致

4.忽略匹配,我们可以不要那些属性

5.实体面没有的值在Dto之后也可以在页面显示

实体的值

c6679056550028a00402a7bb36ad84fc_3531.png

 

最后映射的值

91a233a0e85181ab0bf441d7a8a2c72f_3537.png

根据上面的规则把价格低于40的商品名字改为了N/A

把商品价格加了20

在Dto中新增了实体中没有的属性Content并赋值

把为空的日期赋值为2012-12-12

把name的值映射到GoodsName上

把Name和Brands.Name两个字段合并值

把isDeleted的值忽略掉全变成false

当有多个Profile的时候,我们可以这样添加:

public class Configuration
{
    public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.AddProfile<Profiles.SourceProfile>();
            cfg.AddProfile<Profiles.OrderProfile>();
            cfg.AddProfile<Profiles.CalendarEventProfile>();
        });
    }
}


 

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
Web App开发 前端开发 JavaScript
从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探
更新反馈 1、博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充。 代码已上传Github+Gitee,文末有地址   今天忙着给小伙伴们提出的问题解答,时间上没把握好,都快下班了,赶紧发布:书说上文《从壹开始前后端分离【 .
1644 0
|
前端开发 数据库 数据安全/隐私保护
|
API 数据库 .NET
【Web API系列教程】3.5 — 实战:处理数据(创建数据传输对象)
现在,我们的Web API暴露数据库实体给客户端,而客户端接收直接映射到你的数据库表的数据。然而,这不永远都是个好办法。有时候你可以想要改变发送到客户端的数据的形式。
1036 0
|
8月前
|
SQL 分布式计算 监控
在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
【2月更文挑战第32天】在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
81 6
|
8月前
|
存储 SQL NoSQL
数据传输DTS同步问题之同步失败如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
8月前
|
Cloud Native NoSQL 关系型数据库
数据传输DTS校验问题之校验报错如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
5月前
|
存储 安全 关系型数据库
跨越地域的数据传输大冒险!如何轻松更换DTS实例地域,全面攻略揭秘!
【8月更文挑战第15天】在数字时代的浪潮中,数据传输服务(DTS)是企业跨地域扩张的重要桥梁。然而,更换DTS实例地域就像是一场冒险旅程,充满了未知和挑战。本文将带你踏上这场跨越地域的数据传输大冒险,揭示如何轻松更换DTS实例地域的秘密。无论你是追求速度的迁移高手,还是成本敏感的手动操作者,这里都有你需要的答案。让我们一起探索这个神秘的世界,解锁数据传输的无限可能!
61 0
|
5月前
|
关系型数据库 MySQL OLAP
数据传输DTS是什么?
【8月更文挑战第30天】数据传输DTS是什么?
445 3
|
7月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之当使用DTS(数据传输服务)同步的表在目标库中进行LEFT JOIN查询时遇到异常,是什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。