浏览器标题切换
浏览器标题切换end

NET添加数据映射的两种方式(手动Controller和自动AutoMapper)

手动添加映射

Controllers 目录下找到所需要添加映射的 xxxcontroller.cs 文件,然后手动添加数据的映射:

using System;
using System.Linq;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using TestWebAPI.DTOs;
using TestWebAPI.Services;

namespace TestWebAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TouristRoutesController : Controller
    {
        private ITouristRouteRepository _touristRouteRepository; // 创建数据仓库的私有变量_        

        public TouristRoutesController(ITouristRouteRepository touristRouteRepository) // 注入旅游仓库的实例
        {
            _touristRouteRepository = touristRouteRepository; // 给私有仓库赋值
        }

        [HttpGet("{touristRouteId:Guid}")]
        public IActionResult GetTouristRouteById(Guid touristRouteId) // 单一
        {
            var touristRouteFromRepo = _touristRouteRepository.GetTouristRoute(touristRouteId);
            if (touristRouteFromRepo == null)
            {
                return NotFound($"旅游路线{touristRouteId}找不到");
            }

// 关键代码*************
            // ↑ 从数据库拿到数据后
            // 对数据做一个从model->DTO的映射
            var touristRouteDto = new TouristRouteDto() // 只给用户显示我们想要显示的字段
            {
                Id = touristRouteFromRepo.Id,
                Title = touristRouteFromRepo.Title,
                Description = touristRouteFromRepo.Description,
                Price = touristRouteFromRepo.OriginalPrice * (decimal) (touristRouteFromRepo.DiscountPresent ?? 1),
                CreateTime = touristRouteFromRepo.CreateTime,
                UpdateTime = touristRouteFromRepo.UpdateTime,
                Features = touristRouteFromRepo.Features,
                Fees = touristRouteFromRepo.Fees,
                Notes = touristRouteFromRepo.Notes,
                Rating = touristRouteFromRepo.Rating,
                
                TravelDays = touristRouteFromRepo.TravelDays.ToString(),
                TripType = touristRouteFromRepo.TripType.ToString(),
                DepartureCity = touristRouteFromRepo.DepartureCity.ToString()
            };
//*************

            // return Ok(touristRouteFromRepo);
            return Ok(touristRouteDto);
        }
    }
}

自动添加映射

自动映射数据模型和DTO,我们需要用到AutoMapper这个包

  1. 安装AutoMapper包(基于dotnet可以衔接IOC反转容器),不要安装错了:

  2. 依赖注入:在 Startup.csConfigureServices 方法中注册 AutoMapper 的服务依赖(把AutoMapper的服务依赖注册进入系统的IOC容器中)

 // 自动扫描程序集里所有包含映射关系的profile文件(profile:映射配置)
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
  1. profiles目录下新建一个 xxxProfile.cs 的文件:
using AutoMapper;
using TestWebAPI.DTOs;
using TestWebAPI.Models;

namespace TestWebAPI.Profiles
{
    /// <summary>
    /// 映射配置
    /// </summary>
    public class TouristRouteProfile : Profile
    {
        /// <summary>
        /// 添加构建函数
        /// </summary>
        public TouristRouteProfile()
        {
            CreateMap<TouristRoute, TouristRouteDto>() // 创建一个映射
                .ForMember(
                    dest => dest.Price,
                    opt => opt.MapFrom(src => src.OriginalPrice * (decimal) (src.DiscountPresent ?? 1))
                )
                .ForMember(
                    dest => dest.TravelDays,
                    opt => opt.MapFrom(src => src.TravelDays.ToString())
                )
                .ForMember(
                    dest => dest.TripType,
                    opt => opt.MapFrom(src => src.TripType.ToString())
                )
                .ForMember(
                    dest => dest.DepartureCity,
                    opt => opt.MapFrom(src => src.DepartureCity.ToString())
                );
        }
    }
}
  1. 修改对应 xxxcontroller.cs 文件:给控制器注入AutoMapper的服务依赖
using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using TestWebAPI.DTOs;
using TestWebAPI.Services;

namespace TestWebAPI.Controllers
{
    [Route("api/[controller]")] // api/touristroute
    [ApiController]
    public class TouristRoutesController : Controller
    {
        private ITouristRouteRepository _touristRouteRepository; 
        private readonly IMapper _mapper;
        
        public TouristRoutesController(ITouristRouteRepository touristRouteRepository, IMapper mapper) 
        {
            _touristRouteRepository = touristRouteRepository;
            _mapper = mapper;
        }

        [HttpGet("{touristRouteId:Guid}")]
        public IActionResult GetTouristRouteById(Guid touristRouteId)
        {
            var touristRouteFromRepo = _touristRouteRepository.GetTouristRoute(touristRouteId);
            if (touristRouteFromRepo == null)
            {
                return NotFound($"旅游路线{touristRouteId}找不到");
            }

            // ↑ 从数据库拿到数据后
            // 对数据做一个从model->DTO的映射
            var touristRouteDto = _mapper.Map<TouristRouteDto>(touristRouteFromRepo);
            return Ok(touristRouteDto);
        }
    }
}
posted @ 2022-10-09 06:43  抓水母的派大星  阅读(251)  评论(0编辑  收藏  举报