首页 > 解决方案 > 如何在 .Net Core 的 Web Api 中使用 AutoMapper?

问题描述

目前,我有这个 Web Api 方法,它手动将我的实体映射到 DTO 对象,它可以正常工作。现在,我想实现我已经安装在ConfigureServices方法中注册的 AutoMapper,并在我的 Web Api 控制器构造函数中创建了 AutoMapper 配置文件类并注入了 automapper。

这是我没有 AutoMapper 的手动映射

[HttpGet]
    public async Task<ActionResult<IEnumerable<MovieDto>>> GetMovies()
    {
        //manual mapping which can be replaced with Automapper
        var movies = (from m in _context.Movies
                      select new MovieDto()
                      {
                          Id = m.Id,
                          MovieTitle = m.MovieTitle,
                          ReleaseDate = m.ReleaseDate,
                          MovieStatus = m.MovieStatus,
                          PhotoFile = m.PhotoFile
                      }).ToListAsync();

        return await movies;

    }

这就是我尝试添加自动映射器以替换手动映射的方式。

[HttpGet]
public async Task<ActionResult<IEnumerable<MovieDto>>> GetMovies()
{
      return _mapper.Map<IEnumerable<MovieDto>>(_context.Movies);
}

但是,它遇到错误Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<CinemaApp.NETCore31.WebAPI.Models.MovieDto>' to 'Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.IEnumerable<CinemaApp.NETCore31.WebAPI.Models.MovieDto>>'

标签: c#automapper

解决方案


您将需要创建一个配置文件并映射您想要执行的所有转换。您不必逐个字段进行此操作,只要名称相同,就可以让 AutoMapper 弄清楚。

这似乎是一个很好的教程: https ://code-maze.com/automapper-net-core/

首先在AutoMapper中创建一个继承自Profile类的类

public class MappingProfile : Profile 
{
   public MappingProfile()
   {
      CreateMap<Movie, MovieDto>();
   }
}

请注意,如果您想映射 fromMovieDtoMovie,则必须创建第二CreateMap行。

在您的Startup.cs类中,您需要注册 Automapper,这将自动扫描程序集中使用以下代码定义 Startup 类的所有配置文件:

public void ConfigureServices(IServiceCollection services)
{
   services.AddAutoMapper(typeof(Startup));
}

推荐阅读