tnblog
首页
登录

映射AutoMapper

64人阅读 2019/10/28 16:14 总访问:10935 评论:2 手机 收藏
分类: .net后台框架

前言 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




评价
有钱人的开发有着你们不懂的快乐!O(* ̄︶ ̄*)O
排名
6
文章
6
粉丝
16
评论
8
{{item.ArticleTitle}}
{{item.BlogName}} : {{item.Content}}