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. 网安日记③之通过iis搭建ftp并使用通过serv-u搭建ftp

    通过iis搭建ftp并使用通过serv-u搭建ftp 安装iis的ftp访问 由于在安装iis时勾选了ftp服务,我们直接在iis界面右键ftp服务打开属性查看本地路径 在电脑目录下打开安装目录,并在 ...

  2. Calcite(一):javacc语法框架及使用

    是一个动态数据管理框架. 它包含许多组成典型数据库管理系统的部分,但省略了存储原语.它提供了行业标准的SQL解析器和验证器,具有可插入规则和成本函数的可自定义优化器,逻辑和物理代数运算符,从SQL到代 ...

  3. POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...

  4. Spring Cloud Alibaba - Feign

    Feign Feign简介 使用Feign实现消费者客户端 使用Feign+Ribbon实现客户端负载均衡 底层的负载均衡策略还是使用Ribbon通过Feign进行调用 Feign的相关配置 ribb ...

  5. [数据结构-平衡树]普通 FHQ_Treap从入门到精通(注释比代码多系列)

    普通 FHQ_Treap从入门到精通(注释比代码多系列) 前提说明,作者写注释太累了,文章里的部分讲解来源于Oi-wiki,并根据代码,有部分增改.本文仅仅发布于博客园,其他地方出现本文,均是未经许可 ...

  6. dubbo学习实践(3)之Dubbo整合Consul及Dubbo配置方式

    前言:上一篇中,已经写到了使用zookeeper为注册中心的配置,下面写下配置Consul为注册中心 1. Consul注册中心验证 修改provider和consumer的服务配置文件 Provid ...

  7. Ubuntu上安装gevent

    安装libevent; 安装greenlet: sudo easy_install gevent (need net access) bingo! -> python-dev -> lib ...

  8. 1051 Pop Sequence (25分)栈

    刷题 题意:栈的容量是5,从1~7这7个数字,写5个测试数据 做法:模拟栈 #include<bits/stdc++.h> using namespace std; const int m ...

  9. 搭建riscv环境

    1.第一步 clone 需要的源文件(sudo apt install git   如果你没有git)  以下都是给予ubuntu18.04 $ git clone --recursive https ...

  10. CycliBarriar和CountdownLatch(计数器)

    CyclicBarrier可以重复使用,而CountdownLatch不能重复使用. countDownLatch这个类使一个线程等待其他线程各自执行完毕再执行. 是通过一个计数器来实现的,计数器的初 ...