AutoMapper它是一种对象与对象之间的映射器,让AutoMapper有意思的就是在于它提供了一些将类型A映射到类型B这种无聊的实例,只要B遵循AutoMapper已经建立的惯例,那么大多数情况下就可以进行相互映射了。

安装
nuget搜索AutoMapper.Extensions.Microsoft.DependencyInjection 安装,会自动安装AutoMapper

创建Entities文件夹,新建User Model

namespace Blogs.WebApi.Entities
{
public class Users
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Gender { get; set; }
}
}

创建Dto文件夹,新建UsersDto类,为了掩饰,把FistName和LastName合并为FullName

namespace Blogs.WebApi.Dto
{
public class UsersDto
{
public int ID { get; set; }
public string FullName { get; set; }
public string Email { get; set; }
public string Gender { get; set; }
}
}

Startup.cs类增加数据库服务

services.AddDbContext<DataContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Default")));

新建DataContext类,DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >)

using Microsoft.EntityFrameworkCore;

namespace Blogs.WebApi.Entities
{
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{ }
public DbSet<Users> Users { get; set; }
}
}

创建Services文件夹,新建IUsersRepository仓储接口

using System.Collections.Generic;
using System.Threading.Tasks;
using Blogs.WebApi.Entities; namespace Blogs.WebApi.Services
{
public interface IUsersRepository
{
Task<IEnumerable<Users>> GetAllUsers(); //获取所有用户
Task<Users> GetUsersByID(int id); //根据ID查询单个用户
}
}

新建UsersRepository实现IUsersRepository仓储接口

using System.Collections.Generic;
using System.Threading.Tasks;
using Blogs.WebApi.Entities;
using Microsoft.EntityFrameworkCore; namespace Blogs.WebApi.Services
{
public class UsersRepository : IUsersRepository
{
private readonly DataContext _dataContext; public UsersRepository(DataContext dataContext)
{
_dataContext = dataContext;
}
public async Task<IEnumerable<Users>> GetAllUsers()
{
return await _dataContext.Users.AsNoTracking().ToListAsync();
} public async Task<Users> GetUsersByID(int id)
{
return await _dataContext.Users.AsNoTracking().FirstOrDefaultAsync(u => u.ID == id);
}
}
}

Startup.cs类注入服务依赖

//每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例
services.AddScoped<IUsersRepository, UsersRepository>();
//获取已加载到此应用程序域的执行上下文中的程序集。详情AppDomain.GetAssemblies 方法
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

新建Profiles文件夹创建UserProfile类创建映射,继承自Profile类映射集合

using AutoMapper;
using Blogs.WebApi.Dto;
using Blogs.WebApi.Entities; namespace Blogs.WebApi.Profiles
{
public class UserProfile : Profile
{
public UserProfile()
{
CreateMap<Users, UsersDto>()
.ForMember(
dest => dest.FullName, opt =>
{
opt.MapFrom(s => s.FirstName + "." + s.LastName);
});
}
}
}

从Controller文件夹创建UsersController控制器

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using Blogs.WebApi.Dto;
using Blogs.WebApi.Services;
using Microsoft.AspNetCore.Mvc; namespace Blogs.WebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private readonly IUsersRepository _usersRepository;
private readonly IMapper _mapper; public UsersController(IUsersRepository usersRepository, IMapper mapper)
{
_usersRepository = usersRepository;
_mapper = mapper;
}
// GET: api/<UsersController>
[HttpGet]
public async Task<ActionResult<IEnumerable<UsersDto>>> Get()
{
var users = await _usersRepository.GetAllUsers();
return _mapper.Map<IEnumerable<UsersDto>>(users).ToList();
} // GET api/<UsersController>/5
[HttpGet("{id}")]
public async Task<ActionResult<UsersDto>> Get(int id)
{
var user = await _usersRepository.GetUsersByID(id);
return _mapper.Map<UsersDto>(user);
}
}
}

PostMan效果展示

入门讲解推荐视频https://www.bilibili.com/video/BV1XJ411q7yy?p=12

C# AutoMaper简单使用的更多相关文章

  1. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  2. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  3. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  4. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  5. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  6. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  7. 使用 Nodejs 搭建简单的Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...

  8. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  9. 简单入门canvas - 通过刮奖效果来学习

    一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...

随机推荐

  1. 白话JavaScript原型链和继承

    原型基础 每个函数都有一个prototype属性,指向函数的原型对象 每个对象都一个私有属性 __proto__, 默认指向其构造函数的prototype 在JS中所有函数都是Function构造出来 ...

  2. Java 17 将要发布,补一下 Java 13 中的新功能

    本文章属于Java 新特性教程 系列,已经收录在 Github.com/niumoo/JavaNotes ,点个赞,不迷路. 自从 Oracle 调整了 Java 的版本发布节奏之后,Java 版本发 ...

  3. openresty——yum安装 配置 使用 错误处理 docker方式安装

    yum方式安装 wget https://openresty.org/package/centos/openresty.repo mv openresty.repo /etc/yum.repos.d/ ...

  4. 洛谷P2210题解

    题面 模拟退火练手好题. 对于这个题,一般有两种解法: 每次随机两个数交换. 每次直接打乱数组. 两个方法都可以过,我写了第一种,因为不想用stl. 代码

  5. Vue+SpringBoot前后端分离中的跨域问题

    在前后端分离开发中,需要前端调用后端api并进行内容显示,如果前后端开发都在一台主机上,则会由于浏览器的同源策略限制,出现跨域问题(协议.域名.端口号不同等),导致不能正常调用api接口,给开发带来不 ...

  6. 干了六年Android开发现在裸辞失业了,再过2个月就30了,该怎么继续生活?

    这是我在某论坛看到别人分享的故事,觉得可以展开聊一下,对于我们这些中年程序员,可以裸辞吗? 前言 首先介绍一下主人公的情况.目前所在的是一家小的创业公司,待了3年多,薪资一般吧,之前在一家中型上市企业 ...

  7. HCNA Routing&Switching之DHCP服务

    前文我们了解了STP的端口状态.计时器以及端口状态切换和网络拓扑变化相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15140672.html:今天我们 ...

  8. erlang学习笔记

    安装 Ubuntu Server上: sudo apt-get install erlang 如果安装时下载 太慢,可手工下载deb包( esl-erlang_16.a-rc1_ubuntu_prec ...

  9. jd-gui或jad反编译工具bug

    文件1:A.class------------2020-09-01日版本 文件2:A.class------------2020-09-02日版本,代码内容有变动. bug出现条件:文件1或文件2同目 ...

  10. swagger菜单分级

    效果 实现 SwaggerAutoConfiguration里新增配置: package com.fxkj.common.config; import com.google.common.base.P ...