c# - 依赖注入网络核心 InvalidOperationException
问题描述
我是 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; }
}
任何输入将不胜感激。
解决方案
您不应该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);
推荐阅读
- css - JavaFx (JDK8) - 在 ContextMenu 中设置按钮样式的最简单方法?
- visual-studio - 如何制作字符串“For hes a jolly good guy”的循环 3x / Rubric 附加在特定要求上
- javascript - 使用 if 语句隐藏元素(纯 Javascript)
- javascript - vue 发出事件并在父组件中接收
- cmd - 命令 pipenv 中的 Git Bash 与 cmd 颜色
- selenium - Webapp 中 SauceLabs 中的模拟相机源
- python - Web Scraping - 弹出窗口中的多个表
- neo4j - 在 Apollo-server 中接受参数时,字段级密码语句不起作用
- octave - 如何在 Octave 中安装优化包?
- javascript - 通过 chrome 扩展从当前网页的 DOM 中获取数据