设为首页 加入收藏

TOP

在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射(一)
2019-10-09 19:59:09 】 浏览:101
Tags:ASP.NET Core 项目 使用 AutoMapper 进行 实体 映射

 一、前言

  在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能存在很大的差异,所以这里更常见的方法是去创建一些对应于页面数据展示的 `视图模型` 类,通过对获取到的数据进行二次加工,从而满足实际页面显示的需要。

  因此,如何更便捷的去实现 数据库持久化对象 与 视图对象 间的实体映射,避免我们在代码中去一次次的手工实现这一过程,就可以降低开发的工作量,而 AutoMapper 则是可以帮助我们便捷的实现实体转换这一过程的利器。所以,本章我们就来学习如何在 ASP.NET Core 项目中通过使用 AutoMapper 去完成实体间的映射。

  当然,如果你习惯于从视图展现到持久化到数据库都采用数据库实体,那么本篇文章对你可能不会有任何的帮助。

  代码仓储:https://github.com/Lanesra712/grapefruit-common/tree/master/sample/aspnetcore/aspnetcore-automapper-tutorial

 二、Step by Step

  AutoMapper 是一个 OOM(Object-Object-Mapping) 组件,从名字上就可以看出来,这一系列的组件主要是为了帮助我们实现实体间的相互转换,从而避免我们每次都采用手工编写代码的方式进行转换。在没有采用 OOM 组件之前,如果我们需要实现类似于一份数据在不同客户端显示不同的字段,我们只能以手工的、逐个属性赋值的方式实现数据在各个客户端数据类型间的数据传递,而 OOM 组件则可以很方便的帮我们实现这一需求。

  1、几个概念

  在上面我们有提到 数据库持久化对象 和 视图对象 这两个概念,其实除了这两个对象的概念之外,还存在一个 数据传输对象 的概念,这里我们来简单阐述下这三种对象的概念。

  数据库持久化对象(Persistent Object):顾名思义,这个对象是用来将我们的数据持久化到数据库,一般来说,持久化对象中的字段会与数据库中对应的 table 保持一致。

  这里,如果你采用了 DDD 的思想去指导设计系统架构,其实最终落地到我们代码中的其实是 领域对象(Domain Object),它与 数据库持久化对象 最显著的差异在于 领域对象 会包含当前业务领域的各种事件,而 数据库持久化对象 仅是包含了数据库中对应 table 的数据字段信息。

  视图对象(View Object):视图对象 VO 是面向前端用户页面的,一般会包含呈现给用户的某个页面/组件中所包含的所有数据字段信息。

  数据传输对象(Data Transfer Object):数据传输对象 DTO 一般用于前端展示层与后台服务层之间的数据传递,以一种媒介的形式完成 数据库持久化对象 与 视图对象 之间的数据传递。

  这里通过一个简单的示意图去解释下这三种对象的具体使用场景,在这个示例的项目中,我省略了数据传输对象,将数据库持久化对象直接转换成页面显示的视图对象。

  2、组件加载

  首先我们需要通过 Nuget 将 AutoMapper 加载到项目中,因为这个示例项目只包含一个 MVC 的项目,并没有多余的分层,所以这里需要将两个使用到的 dll 都添加到这个 MVC 项目中。

Install-Package AutoMapper
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection

  这里我添加了 AutoMapper.Extensions.Microsoft.DependencyInjection 这个程序集,从这个程序集的名字就可以看出来,这个程序集主要是为了我们可以通过依赖注入的方式在项目中去使用 AutoMapper。

  在 .NET Fx 的时代,我们使用 AutoMapper 时,可能就像下面的代码一样,更多的是通过 Mapper 的几个静态方法来实现实体间的映射,不过在 .NET Core 程序中,我们首选还是采用依赖注入的方式去完成实体间的映射。

// 构建实体映射规则
Mapper.Initialize(cfg => cfg.CreateMap<OrderModel, OrderDto>());

// 实体映射
var order = new OrderModel{};
OrderDto dto = Mapper.Map<OrderModel,OrderDto>(order);

  3、使用案例

  因为原本想要使用的示例项目是之前的 ingos-server 这个项目,由于目前自己有在学习 DDD 的知识,并且有在按照微软的 eShopOnContainers 这个项目中基于 DDD 思想设计的框架,对自己的这个 ingos-server 项目进行 DDD 化的调整,嗯,其实就是照葫芦画瓢,所以目前整个项目被我改的乱七八糟的,不太适合作为示例项目了,所以这里新创建了一个比较单纯的 ASP.NET Core MVC 项目来作为这篇文章的演示项目。

  因为这个示例项目只是为了演示如何在 ASP.NET Core 项目中去使用 AutoMapper,所以这里并没有进行分层,整个示例页面的运行流程就是,PostController 中的 List Action 调用 PostAppService 类中的 GetPostLists 方法去获取所有的文章数据,同时在这个方法中会进行实体映射,将我们从 PostDomain 中获取到的 PO 对象转换成页面展示的 VO 对象,项目中每个文件夹的作用见下图所示。

  这里的示例项目是演示当我们从数据库获取到需要的数据后,如何完成从 PO 到 VO 的实体映射,PostModel(PO)和 PostViewModel(VO)的类定义如下所示。

public class PostModel
{
    public Guid Id { get; set; }
    public long SerialNo { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public string Image { get; set; }
    public short CategoryCode { get; set; }
    public bool IsDraft { get; set; }
    public string Content { get; set; }
    public DateTime ReleaseDate { get; set; }
    public virtual IList<CommentModel> Comments { get; set; }
}

public class PostViewModel
{
    public Guid Id { get; set; }
    public long SerialNo { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public short CategoryCode {
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇EF Core 实现读写分离的最佳方案 下一篇.NET开发者必须学习.NET Core

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目