首页 > 解决方案 > 依赖注入网络核心 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; }
}

任何输入将不胜感激。

标签: c#asp.net.netdependency-injectionautomapper

解决方案


您不应该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);

推荐阅读