映射AutoMapper
前言 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