依赖注入网络核心 InvalidOperationException

时间:2021-07-25 11:44:47

标签: c# asp.net .net dependency-injection automapper

我是 AutoMapper 的新手,我正在尝试构建 API。启动新 API 项目 (WeatherForecast) 时出现的默认端点工作正常。但是,当我尝试到达端点 api/nationalparks 时,出现此错误:

enter image description here

控制器:

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; }
}

任何输入将不胜感激。

1 个答案:

答案 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);