ASP.NET Core 2.2: невозможно разрешить службу для типа «AutoMapper.IMapper» - PullRequest
0 голосов
/ 17 января 2019

Ядро ASP.NET (версия: 2.2.102)

Я создаю API для возврата Portos и Especies, но каждый раз, когда я получаю доступ к / api / portos (как определено в контроллере), я получаю эту ошибку:

InvalidOperationException: невозможно разрешить службу для типа «AutoMapper.IMapper» при попытке активации 'Fish.Controllers.PortosController'.

Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService (IServiceProvider sp, тип Type, тип requiredBy, bool isDefaultParameterRequired)

Я не уверен, что я делаю неправильно, поэтому любая помощь приветствуется.


Модель


Especie.cs

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace fish.Models
{
    [Table("Especies")]
    public class Especie
    {
        public int Id { get; set; }
        [Required]
        [StringLength(255)]
        public string Nome { get; set; }

        public Porto Porto { get; set; }
        public int PortoId { get; set; }
    }
}

Porto.cs

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;

namespace fish.Models
{
    public class Porto
    {
        public int Id { get; set; }
        [Required]
        [StringLength(255)]
        public string Nome { get; set; }
        public ICollection<Especie> Models { get; set; }

        public Porto()
        {
            Models = new Collection<Especie>();
        }
    }
}

Контроллер


PortoController.cs

using System.Collections.Generic;
using System.Threading.Tasks;
using AutoMapper;
using AutoMapper.QueryableExtensions;
using fish.Controllers.Resources;
using fish.Models;
using fish.Persistence;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace fish.Controllers
{
    public class PortosController : Controller
    {
        private readonly FishDbContext context;
        private readonly IMapper mapper;
        public PortosController(FishDbContext context, IMapper mapper)
        {
            this.mapper = mapper;
            this.context = context;
        }


        [HttpGet("/api/portos")]
        public async Task<IEnumerable<PortoResource>> GetPortos()
        {
            var portos = await context.Portos.Include(m => m.Models).ToListAsync();

            return mapper.Map<List<Porto>, List<PortoResource>>(portos);
        }

    }
}

Контроллер> Ресурсы

PortoResources.cs

using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace fish.Controllers.Resources
{
    public class PortoResource
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public ICollection<EspecieResource> Models { get; set; }

        public PortoResource()
        {
            Models = new Collection<EspecieResource>();
        }
    }
}

EspecieResource.cs

namespace fish.Controllers.Resources
{
    public class EspecieResource
    {
        public int Id { get; set; }
        public string Nome { get; set; }
    }
}

Более соответствующий код


Stratup.cs

public void ConfigureServices(IServiceCollection services)
{
        services.AddAutoMapper();

        services.AddDbContext<FishDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default")));

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        // In production, the Angular files will be served from this directory
        services.AddSpaStaticFiles(configuration =>
        {
            configuration.RootPath = "ClientApp/dist";
        });
}

MappingProfile.cs

using AutoMapper;
using fish.Controllers.Resources;
using fish.Models;

namespace fish.Mapping
{
    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<Porto, PortoResource>();
            CreateMap<Especie, EspecieResource>();
        }
    }
}

FishDbContext.cs

using fish.Models;
using Microsoft.EntityFrameworkCore;

namespace fish.Persistence
{
    public class FishDbContext : DbContext
    {
        public FishDbContext(DbContextOptions<FishDbContext> options) : base(options)
        {

        }

        public DbSet<Porto> Portos { get; set; }
    }
}

1 Ответ

0 голосов
/ 17 января 2019

Вам нужно будет использовать пакет automapper, как показано ниже:

Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection

Это также, в свою очередь, установит пакет Nuget Automapper, если у вас его еще нет.

Затем, внутри вашего метода ConfigureServices вашего startup.cs, вам нужно будет добавить к нему вызов, как показано ниже.

public void ConfigureServices(IServiceCollection services)
{
    services.AddAutoMapper();
}

Подробнее см. в этом блоге.

EDIT:

Есть очень хорошее описание из этой темы.

Вам нужно добавить код, как показано ниже в файле startup.cs.

Вы пропустили добавление IMapper в DI. Пожалуйста, обратитесь, добавьте Singleton call из-под кода.

public void ConfigureServices(IServiceCollection services) {
    // .... Ignore code before this

   // Auto Mapper Configurations
    var mappingConfig = new MapperConfiguration(mc =>
    {
        mc.AddProfile(new MappingProfile());
    });

    IMapper mapper = mappingConfig.CreateMapper();
    services.AddSingleton(mapper);

    services.AddMvc();

}
...