Вопрос об использовании AutoMapper в ядре asp.net - PullRequest
0 голосов
/ 02 сентября 2018

Я следую учебному пособию по ядру asp.net и угловой. Когда я добавляю Automapper в мой класс Startup, он прерывает работу dotnet cli и не может отобразить страницу. Вот как я использую Automapper в Startup:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SpaServices.AngularCli;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using aspcoreangular.persistence;
using AutoMapper;

namespace aspcoreangular
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAutoMapper();
            services.AddDbContext<VegaDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default")));
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

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

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");
            });

            app.UseSpa(spa =>
            {
                // To learn more about options for serving an Angular SPA from ASP.NET Core,
                // see https://go.microsoft.com/fwlink/?linkid=864501

                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseAngularCliServer(npmScript: "start");
                }
            });
        }
    }
}

Вот как я использую его в контроллере. Но до этого момента дело не доходит

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using aspcoreangular.models;
using aspcoreangular.persistence;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace aspcoreangular.Controllers
{
    public class MakesController : Controller
    {
        private readonly VegaDbContext context;
        private readonly IMapper mapper;

        protected MakesController(VegaDbContext context, IMapper mapper)
        {
            this.mapper = mapper;
            this.context = context;
        }

        [HttpGet("/api/makes")]
        public async Task<IEnumerable<Resources.MakeResource>> GetMakes()
        {
            var makes =  await context.Makes.Include(m => m.Models).ToListAsync();
            return mapper.Map<List<Make>, List<Resources.MakeResource>>(makes);
        }
    }
}

Это изображение аварии: enter image description here Можете ли вы помочь мне с этим? Спасибо.

Это мой класс MakeResouce

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using aspcoreangular.models;

namespace aspcoreangular.Controllers.Resources
{
    public class MakeResource
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<ModelResource> Models { get; set; }

        public MakeResource()
        {
            Models = new Collection<ModelResource>();
        }
    }
}

и в моем профиле картирования

using aspcoreangular.Controllers.Resources;
using aspcoreangular.models;
using AutoMapper;

namespace aspcoreangular.ClientApp.Mapping
{
    public class MappingProfile : Profile
    {
        protected MappingProfile()
        {
            CreateMap<Make, MakeResource>();
            CreateMap<Model, ModelResource>();
        }
    }
}

1 Ответ

0 голосов
/ 02 сентября 2018

Когда AutoMapper отображает исходный объект на целевой объект перед отображением самого себя, он должен создать экземпляр целевого объекта, а затем Mapper может отобразить свойства, используя отражение. И ошибка говорит: Для этого объекта не определен конструктор без параметров.


Это означает, что AutoMapper просит класс System.Activator создать для него экземпляр целевого объекта. Но System.Activator терпит неудачу, потому что он не может найти открытый конструктор без параметров в целевом классе (очевидно, System.Activator может использовать конструктор с параметрами, но AutoMapper не предоставил никаких параметров для конструктора). И именно поэтому третья строка сообщения об ошибке происходит из метода Activator.CreateInstance.


Итак, чтобы подвести итог, вы должны проверить класс Resources.MakeResource (как место назначения) для конструктора без параметров .

PS. Но я не могу сказать вам, почему это исключение вызывает сбой всего приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...