Как добавить глобальные параметры конфигурации в Automapper v8, используя экземпляр API с .net core 2.2 - PullRequest
0 голосов
/ 11 июня 2019

Я использую:

  • .net core v2.2.0
  • Microsoft.EntityFrameworkCore v2.2.4
  • automapper v8.1.1
  • AutoMapper.Extensions.Microsoft.DependencyInjection v6.1.1
  • VS2017 Community Edition v15.9.12

В моем решении у меня есть:

  • TVC_DATA: обрабатывает весь доступ к данным и содержит классы профиля сопоставления
  • TVC_PORTAL: реагировать на веб-приложение

У меня есть автоматическая настройка, использующая внедрение зависимостей, следуя инструкциям, описанным здесь

Итак: в файле startup.cs TVC_PORTAL в методе ConfigureServices у меня есть:

services.AddAutoMapper(typeof(AutomapProfileGen));

, где я использую AutoMapProfileGen - один из типов маркеров для AddAutoMapper для определения местоположения сборки TVC_DATA, где также расположены другие профили.

В моем ObjectController я вставляю IMapper:

public ObjectController(IHostingEnvironment environment, IMapper mapper)
{
        _hostingEnvironment = environment;            
        _mapper = mapper;
}

И я использую маппер позже:

IEnumerable<ObjectViewType> vList = _mapper.Map<IEnumerable<ObjectType>, IEnumerable<ObjectViewType>>(mList);

Мои профили довольно просты, например:

public class AutomapProfileSrc : Profile
{
    public AutomapProfileSrc()
    {
        //source data
        CreateMap<AirlineView, Airline>().ReverseMap();
        CreateMap<AirlineListView, Airline>().ReverseMap();
        CreateMap<AirportView, Airport>().ReverseMap();
        CreateMap<AirportListView, Airport>().ReverseMap();
        CreateMap<CountryView, Country>().ReverseMap();
        CreateMap<CountryListView, Country>().ReverseMap();
    }
}

Мой вопрос: я хочу установить некоторые глобальные параметры конфигурации для автомаппера и не могу понять, где / как их установить. Например: я хочу установить для ValidateInlineMaps значение false (потому что это упоминалось как решение, когда AssertConfigurationIsValid выбрасывает исключения «элемент не сопоставлен»). Также я хочу установить MaxDepth на 1 для всех карт, чтобы избежать циклических ссылок. Что я пробовал:

1) Установите для ValidateInlineMaps значение false во всех конструкторах профиля: не работает.

public class AutomapProfileCfg : Profile
{
    public AutomapProfileCfg()
    {
        ValidateInlineMaps = false;
...

2) Создайте объект MapperConfiguration в ConfigureServices, например:

'var config = new MapperConfiguration(cfg =>
    {
        cfg.ForAllMaps((typeMap, mappingExpression) => {  mappingExpression.MaxDepth(1); });
        cfg.AllowNullCollections = true;
        cfg.ValidateInlineMaps = false;
        //cfg.Advanced.MaxExecutionPlanDepth = 1;
    });'

Но я не знаю, как связать его с экземпляром mapper: просто создание не меняет поведение mapper.

Уже почти сутки изучаю документацию и ищу этот сайт: расстраиваюсь, потому что похоже, что это должно быть просто .... но почему-то я не могу заставить его работать. Любая помощь будет высоко ценится

1 Ответ

1 голос
/ 11 июня 2019

Любые глобальные действия конфигурации могут быть указаны непосредственно при настройке службы:

services.AddAutoMapper(cfg =>
    {
        cfg.ValidateInlineMaps = true;
        ...other config stuff

    }, typeof(AutomapProfileGen)); 
...