ABP(3) - 使用Dto - 官方教程扫盲贴之Dto的使用 (详细解说)

今天的目标

  • 1 学会使用Dto
  • 2 了解Dto的用法
  • 3 学着使用AutoMapper

1 添加 BookDto, 带着问题来学习

Acme.BookStore.Application.Contracts 项目中创建一个名为 BookDtoDTO 类:
using System;
using Volo.Abp.Application.Dtos;

namespace Acme.BookStore
{
    public class BookDto : AuditedEntityDto<Guid>
    {
        public string Name { get; set; }

        public BookType Type { get; set; }

        public DateTime PublishDate { get; set; }

        public float Price { get; set; }
    }
}

2 Dto的映射, 我们如何知道Dto是和哪个实体映射的. 启动模板配置了 AutoMapper, 这样我们就可以使用 CreateMap 方法来进行映射.

需在 Acme.BookStore.Application 项目的 BookStoreApplicationAutoMapperProfile 类中定义映射:
using AutoMapper;

namespace Acme.BookStore
{
    public class BookStoreApplicationAutoMapperProfile : Profile
    {
        public BookStoreApplicationAutoMapperProfile()
        {
            CreateMap<Book, BookDto>();
        }
    }
}

3 创建用于更新的Dto, 这里可以看到更新的Dto中,增加了很多验证, 必填(Required), 长度(StringLength).

using System;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.AutoMapper;

namespace Acme.BookStore
{
    public class CreateUpdateBookDto
    {
        [Required]
        [StringLength(128)]
        public string Name { get; set; }

        [Required]
        public BookType Type { get; set; } = BookType.Undefined;

        [Required]
        public DateTime PublishDate { get; set; }

        [Required]
        public float Price { get; set; }
    }
}

4 再次增加映射关系

using AutoMapper;

namespace Acme.BookStore
{
    public class BookStoreApplicationAutoMapperProfile : Profile
    {
        public BookStoreApplicationAutoMapperProfile()
        {
            CreateMap<Book, BookDto>();
            CreateMap<CreateUpdateBookDto, Book>(); //<--added this line-->
        }
    }
}

5 总结

  • 1 什么是Dto? 数据传输对象(DTO)(Data Transfer Object),是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。
  • 2 Dto的作用? 为何不直接使用实体对象. 最大的好处是Dto不会像实体一样暴露出所有的属性, 比如createby, createdate 这些字段,并不需要前端处理, 这样就能尽量的减少出错的机会,也非常安全. 比如只允许更新一个字段,那dto就只有一个字段,这样想更新其他的都做不到.
  • 3 ABP已经集成了AutoMapper, 按照官方文档使用即可
  • 4 计划做一个AutoMapper番外篇,如何使用AutoMapper
上一篇:一个留了两个星期的bug,基础忘光了


下一篇:Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念