今天的目标
- 1 学会使用Dto
- 2 了解Dto的用法
- 3 学着使用AutoMapper
1 添加 BookDto
, 带着问题来学习
在 Acme.BookStore.Application.Contracts
项目中创建一个名为 BookDto
的 DTO
类:
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