如何在 .Net Core 的 Web Api 中使用 AutoMapper?
How to use AutoMapper in Web Api in .Net Core?
目前,我有这个 Web Api 方法,它可以手动将我的实体映射到 DTO 对象,并且可以正常工作。现在,我想实现 AutoMapper,我已经在 ConfigureServices
方法中注册并创建了 AutoMapper 配置文件 class 并在我的 Web Api 控制器构造函数中注入了 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>>'
您将需要创建一个配置文件并映射您想要进行的所有转化。不用逐个字段来做,只要名称相同就让AutoMapper自己搞定即可。
这似乎是一个很好的教程:
https://code-maze.com/automapper-net-core/
首先在AutoMapper
中创建一个继承自配置文件class的class
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Movie, MovieDto>();
}
}
请注意,如果您想从 MovieDto
映射到 Movie
,则必须创建第二条 CreateMap
行。
在您的 Startup.cs
class 中,您需要注册 Automapper,这将自动扫描程序集中定义 Startup class 的所有配置文件,代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper(typeof(Startup));
}
如果您正在使用 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 命名空间。
目前,我有这个 Web Api 方法,它可以手动将我的实体映射到 DTO 对象,并且可以正常工作。现在,我想实现 AutoMapper,我已经在 ConfigureServices
方法中注册并创建了 AutoMapper 配置文件 class 并在我的 Web Api 控制器构造函数中注入了 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>>'
您将需要创建一个配置文件并映射您想要进行的所有转化。不用逐个字段来做,只要名称相同就让AutoMapper自己搞定即可。
这似乎是一个很好的教程: https://code-maze.com/automapper-net-core/
首先在AutoMapper
中创建一个继承自配置文件class的classpublic class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Movie, MovieDto>();
}
}
请注意,如果您想从 MovieDto
映射到 Movie
,则必须创建第二条 CreateMap
行。
在您的 Startup.cs
class 中,您需要注册 Automapper,这将自动扫描程序集中定义 Startup class 的所有配置文件,代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper(typeof(Startup));
}
如果您正在使用 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 命名空间。