.NetCore【工作应用】AutoMapper

AutoMapper

OOM(Object-Object-Mapping)组件

为了实现实体间的相互转换,从而避免我们每次采用手工的方式进行转换。

使用

  1. 安装nuget包
install-package AutoMapper
install-package AutoMapper.Extensions.Microsoft.DependencyInjection

AutoMapper.Extensions.Microsoft.DependencyInjection这个包方便通过依赖注入的方式去使用AutoMapper

  1. 定义model和viewmodel
namespace Demo.AutoMapperWeb.Model
{
    public class Student
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public string Gender { get; set; }
    }
}


namespace Demo.AutoMapperWeb.ViewModel
{
    public class StudentVM
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public string Gender { get; set; }
    }
}

  1. 定义class继承Profile

创建model和viewModel之间的map关系

namespace Demo.AutoMapperWeb.Mapper
{
    public class StudentProfile : Profile
    {
        /// <summary>
        /// 构造函数中实现映射
        /// </summary>
        public StudentProfile()
        {
            // Mapping
            // 第一次参数是源类型(这里是Model类型),第二个参数是目标类型(这里是DTO类型)
            CreateMap<Student, StudentVM>();
        }
    }
}

  1. ConfigureServices中添加AddAutoMapper配置
//自动找到所有继承了Profile的类然后进行配置
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
  1. 添加controller的AutoMapper注入,并使用AutoMapper实现自动映射
using AutoMapper;
using Demo.AutoMapperWeb.Model;
using Demo.AutoMapperWeb.ViewModel;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Demo.AutoMapperWeb.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class StudentsController : ControllerBase
    {
        private IMapper _mapper;
        public StudentsController(IMapper mapper)
        {
            this._mapper = mapper;
        }

        [HttpGet]
        public List<StudentVM> Get()
        {
            List<Student> list = new List<Student>();

            for (int i = 0; i < 3; i++)
            {
                Student student = new Student()
                {
                    ID = i,
                    Name = $"测试_{i}",
                    Age = 20,
                    Gender = "男"
                };
                list.Add(student);
            }

            var result = _mapper.Map<List<StudentVM>>(list);
            return result;
        }
    }
}

  1. 列名不相同时在profile中重新map

双向绑定设置

using AutoMapper;
using Demo.AutoMapperWeb.Model;
using Demo.AutoMapperWeb.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Demo.AutoMapperWeb.Mapper
{
    public class StudentProfile : Profile
    {
        /// <summary>
        /// 构造函数中实现映射
        /// </summary>
        public StudentProfile()
        {
            // Mapping
            // 第一次参数是源类型(这里是Model类型),第二个参数是目标类型(这里是DTO类型)
            CreateMap<Student, StudentVM>()
                .ForMember(des => des.StudentId, memberOption =>
                {
                    // 列名不相同时 匹配 studentID<=>id
                    memberOption.MapFrom(map => map.ID);
                })
                 .ForMember(des => des.StudentName, memberOption =>
                 {
                     // 列名不相同时 匹配 studentName<=>name
                     memberOption.MapFrom(map => map.Name);
                 })
                 //.ReverseMap()  //ReverseMap表示双向映射
                 ;
        }
    }
}


源码

posted on 2022-11-26 21:24  杏村牧童  阅读(183)  评论(0编辑  收藏  举报