尘叶心繁

映射AutoMapper

电脑版发表于:2019/10/28 16:14

前言 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()
{
    //时间改个名
    CreateMap<Post, PostResource>()
        .ForMember(dest => dest.UpdateTime,opt=>opt.MapFrom(src=>src.LastModified));

    CreateMap<PostResource,Post>();
}


3.注册映射服务


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




关于TNBLOG
TNBLOG,技术分享
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢