AutoMapper 对象映射器
https://docs.automapper.org/
基于约定的对象-对象映射器。100% 有机和无麸质。消除将一个对象映射到另一个对象的所有麻烦。
什么是 AutoMapper?
AutoMapper 是一个简单的小库,旨在解决一个看似复杂的问题——摆脱将一个对象映射到另一个对象的代码。这种类型的代码写起来相当枯燥乏味,那么为什么不发明一个工具来为我们做呢?
映射可以出现在应用程序的许多地方,但主要是在层之间的边界,例如 UI/Domain 层或 Service/Domain 层之间。一层的关注点经常与另一层的关注点发生冲突,因此对象-对象映射导致分离模型,其中每一层的关注点只能影响该层中的类型。
1. NuGet引用
AutoMapper
AutoMapper.Extensions.Microsoft.DependencyInjection
2. 添加继承 Profile 的映射关系类 MappingProfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | using AutoMapper; using TestWebApplication.Model; namespace TestWebApplication.Extensions { public class MappingProfile:Profile { public MappingProfile() { CreateMap<Post, PostResource>() .ForMember(d=>d.UpdateTime,s=>s.MapFrom(src=>src.LastModified)); CreateMap<PostResource, Post>(); CreateMap<PO, POResource>(); CreateMap<POResource, PO>(); } } } |
3. 注册服务
1 | builder.Services.AddAutoMapper( typeof (MappingProfile)); |
4. 客户通过注入IMapper 消费
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | using AutoMapper; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using TestWebApplication.Model; namespace TestWebApplication.Controllers { [Route( "api/[controller]" )] [ApiController] public class TestAutoMapperController : ControllerBase { private readonly ILogger<TestAutoMapperController> _logger; private readonly IMapper _mapper; private readonly ApplicationDbContext _context; public TestAutoMapperController(ILogger<TestAutoMapperController> logger, IMapper mapper, ApplicationDbContext context) { _logger = logger; _mapper = mapper; _context = context; } [HttpGet(nameof(GetPostResource))] public async Task<ActionResult<PostResource>> GetPostResource() { Post post = new Post { Title = "ASP.NET Core 项目实战" , Author = "杨中科" , Body = "基于DDD与前扣端分离" , LastModified = DateTime.Now, Remark = "From:" + nameof(Post) }; PostResource postResource = _mapper.Map<Post, PostResource>(post); postResource.Remark += $ " To {nameof(PostResource)}" ; return Ok(postResource); } [HttpGet(nameof(GetPost))] public async Task<ActionResult<Post>> GetPost() { PostResource postResource = new PostResource { Title = "ASP.NET Core 项目实战" , Author = "杨中科" , Body = "基于DDD与前扣端分离" , UpdateTime = DateTime.Now, Remark = "From:" + nameof(PostResource) }; Post post = _mapper.Map<PostResource, Post>(postResource); post.Remark += $ " To {nameof(Post)}" ; return Ok(post); } [HttpGet(nameof(GetPO))] public async Task<ActionResult<IEnumerable<POResource>>> GetPO() { var poList = await _context.PO.Take(3).ToListAsync(); IEnumerable<POResource> poResources = _mapper.Map<IEnumerable<PO>, IEnumerable<POResource>>(poList); return Ok(poResources); } } } |
在AutoFac中注册:
https://www.cnblogs.com/friend/p/16915214.html
分类:
.Net Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?