【问题标题】:How to use AutoMapper in Web Api in .Net Core?如何在 .Net Core 的 Web Api 中使用 AutoMapper?
【发布时间】:2020-06-12 13:10:56
【问题描述】:

目前,我有这个 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&lt;CinemaApp.NETCore31.WebAPI.Models.MovieDto&gt;' to 'Microsoft.AspNetCore.Mvc.ActionResult&lt;System.Collections.Generic.IEnumerable&lt;CinemaApp.NETCore31.WebAPI.Models.MovieDto&gt;&gt;'

【问题讨论】:

  • =&gt; _mapper.Map&lt;IEnumerable&lt;MovieDto&gt;&gt;(await _context.Movies.ToListAsync());
  • @LucianBargaoanu 我试过了,但还是一样的错误
  • 如果ProjectTo 有效,那就最好了。

标签: c# automapper


【解决方案1】:

如果您使用的是 AutoMapper V9,您可以像这样使用ProjectTo 扩展方法

private readonly IMapper _mapper;

public MovieController(IMapper mapper)
{
    _mapper = mapper;
}

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

要使用ProjectTo,您需要添加 AutoMapper.QueryableExtensions 命名空间。

【讨论】:

  • 我认为使用IMapper.ProjectTo更有意义。
【解决方案2】:

您需要创建一个配置文件并映射您想要执行的所有转换。你不必逐个字段地做这个,只要名称相同,你就可以让 AutoMapper 找出来。

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

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

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

请注意,如果您想从 MovieDto 映射到 Movie,则必须创建第二条 CreateMap 行。

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

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

【讨论】:

  • 您可以像这样使用.ReverseMap(),而不是创建第二条CreateMap 行来反向映射:CreateMap&lt;Movie, MovieDto&gt;().ReverseMap();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多