Ошибка автоматического сопоставления — «Для этого объекта не определен конструктор без параметров»

#c# #.net-core #mapping #automapper

#c# #.net-core #сопоставление #автоматическое отображение

Вопрос:

В конечном счете, я пытаюсь отобразить из VehicleViewMOdel -> Vehicle. Источник указан ниже. Следует отметить тот факт, что два свойства из каждого класса имеют разные типы.

код, выполняющий сопоставление

 var newVehicle = Mapper.Map<Vehicle>(vehicleData_);
  

код для сопоставляемых классов
общедоступный класс VehicleViewModel
{
public VehicleViewModel()
{

     }
    //Fuel Economy is in L/Km
    public float CityFuelEconomy {get;set;}
    public float HighwayFuelEconomy {get;set;}
    public float ListPrice {get;set;}
    public float SoldPrice{get;set;}
    [Required]
    public int ModelForeignKey {get;set;}
    [Required]
    public int DealerForeignKey{get;set;}
    public string Notes{get; set;}
    public string Color{get; set;}
}



public class Vehicle
{
    public Vehicle()
    {

    }
    [Key]
    public int Id {get; set;}
    //Fuel Economy is in L/Km
    public float CityFuelEconomy {get;set;}
    public float HighwayFuelEconomy {get;set;}
    public float ListPrice {get;set;}
    public float SoldPrice{get;set;}
    [ForeignKey("VehicleModelId")]
    public virtual VehicleModels ModelForeignKey {get;set;}
    [ForeignKey("VehicleDealerId")]
    public virtual Dealer DealerForeignKey{get;set;}
    public string Notes{get; set;}
    public string Color{get; set;}
}
  

Для обработки сопоставления свойств с различными типами types я использовал следующий ‘formember’ в моей конфигурации automapper (startup.cs)

 Mapper.Initialize(config =>
        {
            config.CreateMap<VehicleViewModel, Vehicle>()
            .ForMember(dest => dest.DealerForeignKey, opt => opt.MapFrom<DealerResolver>())
            .ForMember(dest => dest.ModelForeignKey, opt => opt.MapFrom<VehicleModelResolver>()).ReverseMap();
        });
  

Упомянутые преобразователи (VehicleModelResolver и DealerResolver) просто принимают исходное свойство (в данном случае тип integer) и возвращают объект правильного типа для транспортного средства.ModelForeignKey и транспортное средство.DealerForeignKey

 private IVehicleRepository _vehicleRepo;
    public DealerResolver(IVehicleRepository vehicleRepo_)
    {
        _vehicleRepo = vehicleRepo_;
    }

    public Dealer Resolve(VehicleViewModel source, Vehicle destination, Dealer destMember, ResolutionContext context)
    {
        List<Dealer> dealers = _vehicleRepo.GetDealerById(source.DealerForeignKey).ToList();
        return dealers.FirstOrDefault();
    }


public class VehicleModelResolver : IValueResolver<VehicleViewModel, Vehicle, VehicleModels>
{
    private IVehicleRepository _vehicleRepo;
    public VehicleModelResolver(IVehicleRepository vehicleRepo_)
    {
        _vehicleRepo = vehicleRepo_;
    }

    public VehicleModels Resolve(VehicleViewModel source, Vehicle destination, VehicleModels destMember, ResolutionContext context)
    {
        List<VehicleModels> vehModels = _vehicleRepo.GetModelById(source.ModelForeignKey).ToList();
        return vehModels.FirstOrDefault();
    }
}
  

При запуске кода я вижу сообщение об ошибке «Для этого объекта не определен конструктор без параметров».
Пошаговое выполнение кода во время выполнения показывает, что сопоставление происходит просто отлично для всех свойств, вплоть до VehicleViewModel .MOdelForeignKey.

Есть что-то в отображении VehicleViewModel.ModelForeignKey -> Транспортное средство.ModelForeignKey, который я просто не вижу в данный момент. Как я уже говорил ранее, я понимаю, что свойства имеют разные типы, но тогда преобразователи должны позаботиться об этом. Есть идеи?

Обновление — было предложение по этому поводу — DI был настроен неправильно. Сделал краткое видео с подробным описанием проблемы и ее решения https://youtu.be/tGU7TjDvSK8

Комментарии:

1. Скорее всего, ваша конфигурация DI нарушена.

2. Спасибо за ваш вклад. Этим проектом я занимаюсь в свободное время, поэтому мне может потребоваться некоторое время, чтобы ответить.

3. честно говоря, у меня все еще не работает это, по крайней мере, после 3 часов попыток разных вещей. Лучшее, что я могу сказать, это то, что automapper действительно знает, как сконструировать один из параметров для экземпляра IValueResolver. Есть ли возможность получить подсказку или хотя бы пример кода с простым объяснением? сам код находится на github.com/Ted95153420/CarWebApp (Ветвь — chapter6_API)

4. Это именно то, что делает документация. Я бы начал с этого, посмотрел, как это работает, а затем построил на нем. Для .Net Core даже есть специальный раздел.

5. Да — чтение документации решило мою проблему. Я задокументировал проблему и ее решение немного более подробно в скринкасте. youtu.be/tGU7TjDvSK8

Ответ №1:

youtu.be/tGU7TjDvSK8

На самом деле это не мой ответ, я просто снял видео, чтобы сделать его предельно понятным. — Я хотел бы поблагодарить Люциана Баргаоану за реальный ответ.