今天刚看到老张的哲学博客关于AutoMapper的教程,从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十三 || DTOs 对象映射使用,项目部署Windows+Linux完整版, 看得我有点晕,我搞不得那个CustomProfile跟AutoMapperProfile是干什么用的,可能我水平也比较菜,理解能力差点,然后我通过百度后,发现这个确实就是一个很简单的东西。

主要分四步

  1. 安装Nuget依赖包 AutoMapper(我安装时是8.1版本,这个包在你Web层跟放Profile类的层上),AutoMapper.Extensions.Microsoft.DependencyInjection(依赖注入的,主要是用到一个AddAutoMapper方法,这个是安装在Web层的),如果你没有分层的话,你也可以只安装个AutoMapper.Extensions.Microsoft.DependencyInjection就行了,因为这个包本身就依赖AutoMapper包;
  2. 创建继承Profile类(这是AutoMapper的配置类)的子类,这个是用来配置实体跟DTO的映射的配置;
  3. 在Web层的Startup.cs的ConfigureServices方法中增加services.AddAutoMapper(),这个方法会获取程序集里所有继承Profile类的派生类进行注册并把IMapper注入到服务容器里;
  4. 然后就可以在Controller或Service里通过构造函数注入IMapper,然后用mapper.map<>()进行实体与DTO的转换了。

注:我在第一次安装Nuget包时出现一个比较奇怪的情况,就是我先安装的AutoMapper.Extensions.Microsoft.DependencyInjection包,然后直接在Web层测试怎么用AutoMapper,学会后我想把Profile放到Service层后,然后在Service层上安装AutoMapper包,然后按F6生成解决方案后,发现依赖包就自动消失了,弄了好久次,一按F6,AutoMapper包就自动消失,我一直搞不懂为什么,然后我把整个解决方案里AutoMapper相关的代码跟依赖包都删了,然后再安装个AutoMapper跟AutoMapper.Extensions.Microsoft.DependencyInjection,就正常了,后面我想重现之前的问题,但发现我怎么装都正常了,这是个很奇怪的问题,我也搞不懂为什么。

以下是我的解决方案目录,第一个红圈是Web层,第二个红圈是Service层,我把映射的Profile放在Service层的AutoMapper目录,因为我觉得映射就是Service该干的活

这是实体类SysUser,我放在了Entity层

public class SysUser
{
[Key]
public int Id { get; set; } public string LoginName { get; set; } public string Name { get; set; }
}

这是SysUser对应的DTO类SysUserDTO,我放在了DTO层,注意那个TestName字段,是我等下用来演示用的

public class SysUserDTO
{
public int Id { get; set; }
public string LoginName { get; set; }
public string Name { get; set; }
public string TestName { get; set; }
}

然后我在Service里创建一个文件夹AutoMapper,创建一个MapperProfile.cs类,记得安装AutoMapper包

MapperProfile.cs,我目前是把所有实体跟DTO的映射都写在一个Profile类中,就是创建很多个CreateMap

using AutoMapper;
using System;
using System.Collections.Generic;
using System.Text;
using ItSys.Entity;
using ItSys.DTO; namespace ItSys.Service.AutoMapper
{
public class MapperProfile : Profile
{
public MapperProfile()
{
//创建SysUser往SysUserDTO转换的映射,ReverseMap是创建反向映射,不过我发现如果都是同名的属性的话,没加这个ReverseMap也是能反向映射的
CreateMap<SysUser, SysUserDTO>().ReverseMap();
}
}
}

然后在Web层的Startup.cs类里的ConfigureServices方法里AddAutoMapper(记得安装AutoMapper.Extensions.Microsoft.DependencyInjection包),这个方法会自动找到所有继承了Profile类的配置类进行映射配置

public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper();
}

注意这个方法如果像我上面这样写的话,就会获取所有引用的程序集里所有继承了Profile类的派生类进行配置,所以我即使Profile放在Service层里也是能获取到的,当然你也可以传入一个程序集参数,例如这样:AddAutoMapper(Assembly.GetAssembly(typeof(BaseService<>))),或者传入一个类AddAutoMapper(typeof(BaseService<>)),那AutoMapper就只会在程序集或类的程序集范围内查找了。

然后我在SysUserService类里就可以这样写了,注意红色的代码

using System;
using System.Collections.Generic;
using System.Text;
using ItSys.DTO;
using ItSys.Repository.Sys;
using ItSys.Entity;
using AutoMapper; namespace ItSys.Service.Sys
{
public class SysUserService : BaseService<SysUser>
{
private IMapper _mapper;
protected SysUserRepository repository; public SysUserService(SysUserRepository repository,IMapper mapper)
{
base.baseRepository = repository;
this.repository = repository;
_mapper = mapper;
}
public virtual SysUserDTO GetById(int id)
{
var sysUserEntity = repository.GetById(id);
if (sysUserEntity == null)
{
throw new Exception("没找到数据");
}
return _mapper.Map<SysUserDTO>(sysUserEntity);
}
}
}

所以AutoMapper使用起来就是这么简单的。

对了,关于那个SysUserDTO的TestName字段,如果我想这个字段等于SysUser的LoginName跟Name字段相连的字符串,怎么弄的,很简单,在那个MapperProfile类中这么写

using AutoMapper;
using System;
using System.Collections.Generic;
using System.Text;
using ItSys.Entity;
using ItSys.DTO; namespace ItSys.Service.AutoMapper
{
public class MapperProfile : Profile
{
public MapperProfile()
{
//创建SysUser往SysUserDTO转换的映射,ReverseMap是创建反向映射,如果都是同名的属性的话,没加这个ReverseMap也是能反向映射的,不过像以下这个有特殊属性的,就得加ReverseMap才能正常反向映射
CreateMap<SysUser, SysUserDTO>()
.ForMember(destinationObject => destinationObject.TestName, options =>
{
//目标类的TestName等于实体类的LoginName加上Name字段
options.MapFrom(sourceObject => sourceObject.LoginName + sourceObject.Name);
})
.ReverseMap();
}
}
}

Asp.net Core 2.2关于AutoMapper更初级的入门教程的更多相关文章

  1. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  2. asp.net core 系列之webapi集成Dapper的简单操作教程

    Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...

  3. asp.net core 系列之webapi集成EFCore的简单操作教程

    因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...

  4. Asp.Net Core WebApi中接入Swagger组件(初级)

    开发WebApi时通常需要为调用我们Api的客户端提供说明文档.Swagger便是为此而存在的,能够提供在线调用.调试的功能和API文档界面. 环境介绍:Asp.Net Core WebApi + S ...

  5. 【aspnetcore】在asp.net core中配置使用AutoMapper

    网上使用AutoMapper的文章很多,就不多说了.这里主要记录一下怎么在项目中配置和使用. 首先是从NuGet获取AutoMapper. 在Startup.cs文件中注册AutoMapper服务 p ...

  6. ASP.NET Core 3.1使用 AutoMapper

    多层架构中存在多种模型,如视图模型ViewModel,数据传输对你DTO,ORM对象等,这些数据在层与层之间进行传输必须涉及类型之间的转换. AutoMapper是一个对象-对象映射器,作用是通过设置 ...

  7. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  8. ASP.NET Core搭建多层网站架构【8.2-使用AutoMapper映射实体对象】

    2020/01/29, ASP.NET Core 3.1, VS2019, AutoMapper.Extensions.Microsoft.DependencyInjection 7.0.0 摘要:基 ...

  9. 在 ASP.NET Core 项目中使用 MediatR 实现中介者模式

    一.前言  最近有在看 DDD 的相关资料以及微软的 eShopOnContainers 这个项目中基于 DDD 的架构设计,在 Ordering 这个示例服务中,可以看到各层之间的代码调用与我们之前 ...

随机推荐

  1. Java永久代去哪儿了

    http://www.infoq.com/cn/articles/Java-PERMGEN-Removed 在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法 ...

  2. [开源]基于ffmpeg和libvlc的视频剪辑、播放器

    [开源]基于ffmpeg和libvlc的视频剪辑.播放器 以前研究的时候,写过一个简单的基于VLC的视频播放器.后来因为各种项目,有时为了方便测试,等各种原因,陆续加了一些功能,现在集成了视频播放.视 ...

  3. SOFA 源码分析 — 泛化调用

    前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型. 但也存在一些情况,例 ...

  4. 代码质量管理平台SonarQube的安装、配置与使用

    SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 准备工作: 1.jdk(不再介绍) 2.sonarqube:ht ...

  5. gawk编程语言

    gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据. 22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量 22.1.1 内建变量 ga ...

  6. Java CAS 原理分析

    1.简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制(可以把 CAS 看做乐观锁).CAS 操作包含三个操作数 -- 内存位置.预期数值和新值.CAS ...

  7. Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)

    一.Bean的Scope Scope描述的是Spring容器如何新建Bean实例的.Spring的Scope有以下几种,通过@Scope注解来实现. (1)Singleton:一个Spring容器中只 ...

  8. Git的思想和基本工作原理2

    那么,简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 Git 的时候,请不要尝试把各种概 ...

  9. 3.python元类编程

     1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法.在python中他们对应的分别是属性self.xxx和类方法.但有时我们需要的属性需要根据 ...

  10. 远程文件同步详解(Remote File Sync)

    1. 远程文件同步的常见方式: 1.cron + rsync 优点: 简单 缺点:定时执行,实时性比较差:另外,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输.如果文件数量达到了百万甚 ...