我是 AutoMapper 的新手,我正在尝试构建 API。启动新 API 项目 (WeatherForecast) 时出现的默认端点工作正常。但是,当我尝试到达端点 api/nationalparks 时,出现此错误:
控制器:
namespace NationalParksAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class NationalParksController : Controller
{
private INationalParkRepository _npRepo;
private ParkyMappings _parksMapper;
public NationalParksController(INationalParkRepository npRepo, ParkyMappings parksMapper )
{
_npRepo = npRepo;
_parksMapper = parksMapper;
}
public IActionResult GetNationalParks()
{
var objList = _npRepo.GetNationalParks();
return Ok(objList);
}
}
}
映射器:
public class ParkyMappings : Profile
{
public ParkyMappings()
{
CreateMap<NationalParkEntity, NationalParkDTO>().ReverseMap();
}
}
在启动时配置服务(注意 AddAutoMapper 方法在不使用包 AutoMapper 的情况下工作,与我遵循的教程不同):
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextPool<NationalParksDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ParksDBConnection")));
services.AddScoped<INationalParkRepository, NationalParkRepository>();
services.AddAutoMapper(typeof(ParkyMappings));
services.AddControllers();
}
实体:
public class NationalParkEntity
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string state { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime Eistablished { get; set; }
}
DTO:
public class NationalParkDTO
{
public int Id { get; set; }
public string Name { get; set; }
public string state { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime Eistablished { get; set; }
}
任何输入将不胜感激。
答案 0 :(得分:1)
您不应将 ParkyMappings
作为 Controller
的依赖项。 ParkyMappings
(作为 Profile
子类)仅用于在应用程序启动时初始化 Automapper
。将其放在 Controller
中没有任何意义。
您应该将 IMapper mapper
传递给 Controller
:
namespace NationalParksAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class NationalParksController : Controller
{
private INationalParkRepository _npRepo;
private IMapper _mapper;
public NationalParksController(INationalParkRepository npRepo, IMapper mapper)
{
_npRepo = npRepo;
_mapper = mapper;
}
public IActionResult GetNationalParks()
{
var objList = _npRepo.GetNationalParks();
var entityList = _mapper.Map<NationalParkEntity[]>(objList)
return Ok(entityList);
}
}
}
而且,也许可以使用 Automapper 的注册来代替:
services.AddAutoMapper(this.GetType().Assembly);