Настроить Automapper 9.0 in. Net Core - PullRequest
0 голосов
/ 09 марта 2020

Я следовал официальной документации, утверждая переход от stati c API в отношении Automapper 9.0, но все еще не могу заставить его работать в моем c# do tnet основном приложении. Я получаю следующее исключение:

"AutoMapperMappingException: отсутствует конфигурация карты типов или неподдерживаемое отображение" в классе моего контроллера. "

Можете ли вы показать мне шаги конфигурации как С уважением, Automapper 9.0?

Вот шаги, которые я выполнил:

Startup.cs

      var mappingConfig = new MapperConfiguration(mc =>
        {
           mc.AddProfile(new MyMapperProfile());
         });

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

MyMapperProfile class

CreateMap<MasterData.Models.SupplierMaterial, SupplierMaterial>().
            ForMember(dto => dto.TechnicalDrawings, conf => conf.MapFrom(ol =>
                       ol.TechnicalDrawings.Select(v => v.Id)));

            CreateMap<MasterData.Models.WarehouseUbication, WarehouseUbication>().
            ForMember(dto => dto.MaterialCode, conf => conf.MapFrom(ol => ol.Material.Code));

            CreateMap<MasterData.Models.TechnicalDrawing, TechnicalDrawing>().
                ForMember(dto => dto.MaterialCode, conf => conf.MapFrom(ol => ol.Materials.Select(v => v.Code)))
               .ForMember(dto => dto.SupplierMaterialCode, conf => conf.MapFrom(ol => ol.SupplierMaterials.Select(v => v.Code)));

            CreateMap<MasterData.Models.MaterialDocument, MaterialDocument>().
                ForMember(dto => dto.Materials, conf => conf.MapFrom(ol => ol.Materials.Select(v => v.Code)));

            CreateMap<MasterData.Models.Material, Material>().
                ForMember(dto => dto.WarehouseUbications, conf => conf.MapFrom(ol => ol.WarehouseUbications.Select(v => v.Code)))
                .ForMember(dto => dto.SupplierMaterials, conf => conf.MapFrom(ol => ol.SupplierMaterials.Select(v => v.Code)))
                .ForMember(dto => dto.TechnicalDrawingID, conf => conf.MapFrom(ol => ol.TechnicalDrawing.Id))
                .ForMember(dto => dto.MaterialDocuments, conf => conf.MapFrom(ol => ol.MaterialDocuments.Select(v => v.Materials)));


            //var mapper = config.CreateMapper();

        }



    }
}

Класс контроллера

public MaterialController(IMasterDataService masterService, IMapper mapper)
        {
            this.masterDataService = masterService;
            _mapper = mapper;
        }



  //[route]
     public List<Material> getAllMaterials()
      {
                List<Material> materialsList = new List<Material>();           

                foreach (MasterData.Models.Material m in masterDataService.GetMaterials())
                {
                    _mapper.Map<IEnumerable<Contracts.Material>>(m);
                }            

                return materialsList;
            }

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Ошибка в коде вашего контроллера. Вам следует либо напрямую сопоставить один тип коллекции с другим, используя встроенную поддержку сопоставления коллекций, либо сопоставить каждый элемент индивидуально, создав целевую коллекцию самостоятельно. В настоящее время вы просто отбрасываете сопоставленные объекты и возвращаете пустой список.

public List<Material> getAllMaterials()
{
   var materialsList = _mapper.Map<List<Contracts.Material>>(masterDataService.GetMaterials())

   return materialsList;
}

или:

public List<Material> getAllMaterials()
{
  List<Material> materialsList = new List<Material>();           

  foreach (MasterData.Models.Material m in masterDataService.GetMaterials())
  {
     var mapped = _mapper.Map<Contracts.Material>(m);
     materialsList.Add(mapped);
  }            

  return materialsList;
}
0 голосов
/ 09 марта 2020

Код вашего контроллера должен быть таким:

 public List<Material> getAllMaterials()
 {
            List<Material> materialsList = _mapper.Map<List<Contracts.Material>>(masterDataService.GetMaterials());

            return materialsList;
  }

В противном случае вы отображаете один объект в список. Также вы возвращаете пустой список.

0 голосов
/ 09 марта 2020
public class MasterDataMapperProfile : Profile
{
    public MyMapperProfile()
    {
        CreateMap<MasterData.Models.SupplierMaterial, SupplierMaterial>().
            ForMember(dto => dto.TechnicalDrawings, conf => conf.MapFrom(ol => 
                       ol.TechnicalDrawings.Select(v => v.Id)));
    }
}

Я думаю, это должно исправить это. В настоящий момент внутри профиля вы создаете новый конфиг, регистрируете свое сопоставление в этом конфиге, а затем этот конфиг отбрасывается.

Надеюсь, это поможет

...