
前言 DTO与AutoMapper
DTO
DTO是个什么东东?
DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。
为什么要用DTO?
1、DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层
2、DTO是面向UI的需求而设计的,而领域模型是面向业务而设计的。因此DTO更适合于和表现层的交互,通过DTO我们实现了表现层与领域Model之间的解耦,因此改动领域Model不会影响UI层
3、DTO说白了就是数据而已,不包含任何的业务逻辑,属于瘦身型的对象,使用时可以根据不同的UI需求进行灵活的运用
AutoMapper
现在我们既然知道了使用DTO的好处,那么我们肯定也想马上使用它,但是这里会牵扯一个问题:怎样实现DTO和领域Model之间的转换?
有两个思路,我们要么自己写转换代码,要么使用工具。
不过就应用而言,我还是觉得用工具比较简单快捷,那就使用工具吧。
其实这样的转换工具很多,不过我还是决定使用AutoMapper,因为它足够轻量级,而且也非常流行,国外的大牛们都使用它。
使用AutoMapper可以很方便的实现DTO和领域Model之间的转换,它是一个强大的Object-Object Mapping工具。
1.安装AutoMapper
安装完成后
资源映射文件为(把对应的LastModified属性改成UpdateTime):
Code:
- public class PostResource
- {
- public int Id { get; set; }
- public string Title { get; set; }
- public string Body { get; set; }
- public string Author { get; set; }
- public DateTime UpdateTime { get; set; }
- public string Remark { get; set; }
- }
源EF实体模型为:
Code:
- public class Post: Entity
- {
- public string Title { get; set; }
- public string Body { get; set; }
- public string Author { get; set; }
- public DateTime LastModified { get; set; }
- public string Remark { get; set; }
- }
其Entity中包含Id字段
2.创建映射类
- public MappingProfile:Profile
- {
- public MappingProfile()
- {
- //时间改个名
- CreateMap<Post, PostResource>()
- .ForMember(dest => dest.UpdateTime,opt=>opt.MapFrom(src=>src.LastModified));
-
- CreateMap<PostResource,Post>();
- }
- }
3.注册映射服务
注册AutoMapper
- services.AddAutoMapper(Assembly.GetAssembly(typeof(Program)));
在Startup.cs类中ConfigureServices方法中
- app.UseMyExceptionHandler(loggerFactory);
4.控制器配置
- [HttpGet]
- public async Task<IActionResult> Get(PostParameters postParameters)
- {
- var posts = await _PostRepository.GetAllPosts();
- var postResources = _mapper.Map<IEnumerable<Post>, IEnumerable<PostResource>>(posts);
-
- return Ok(postResources);
- }
3.结果
我们可以看见输出的LastModified字段已经被改成了UpdateTime
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739


剑轩
好是好,这个对效率影响大不大哇,效率高不高