今天的目標
- 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