AutoMapper 9.0.0 (non stati c) выдает конфигурацию карты пропущенного типа или неподдерживаемую ошибку отображения - PullRequest
0 голосов
/ 07 марта 2020

У меня есть веб-API ASP. Net, который использовал Automapper 7.0.1 с сопоставлениями stati c. Я недавно обновился до Automapper 9.0.0, в котором нет отображения stati c. Итак, я использовал рекомендованный способ использования моего контейнера зависимостей (Unity Container) для регистрации экземпляров IMapper и IConfigurationProvider как синглетонов.

var config = AutoMapperConfig.GetMapperConfiguration();
_container.RegisterInstance<IConfigurationProvider>(config, new SingletonLifetimeManager());
_container.RegisterInstance<IMapper>(new Mapper(config), new SingletonLifetimeManager());

AutoMapperConfig.GetMapperConfiguration() - это состояние c метод, который возвращает новый Config со всеми сопоставлениями.

public static MapperConfiguration GetMapperConfiguration()
{
    return new MapperConfiguration(config =>
    {
       config.CreateMap<MyDtoReq, MyModel1>(MemberList.Destination);
       config.CreateMap<MyModel1, MyDtoRes>(MemberList.Destination);
       // other mappings
    }
}

Затем я разрешил и использовал IMapper в многочисленных сервисах, которые зарегистрированы в PerRequestLifetimeManager, например:

_container.RegisterType<IService1, Service1>(new PerRequestLifetimeManager());

Я вижу, что Unity правильно разрешил и Services, и Mapper, но когда я вызываю Map(), используя:

_service1.Mapper.Map<MyDtoRes>(myModel1ObjectInstance);

Это дает мне AutoMapperException, говорящее

Отсутствует тип Конфигурация карты или ошибка неподдерживаемого отображения

Я пробовал многие вещи, включая регистрацию объектов AutoMapper в качестве зависимостей PerRequest, даже в качестве Singletons, использующих класс stati c (без контейнера DI), но безрезультатно.

Я уверен, что мои сопоставления верны, потому что они работали со Stati c AutoMapper в версии 7.0.1. Что я упустил после обновления?

1 Ответ

0 голосов
/ 09 марта 2020

Оказывается, что было 2 проблемы.

  1. Мне нужно было использовать Profile, содержащий все сопоставления. Поэтому я переместил все сопоставления из MapperConfiguration в Profile следующим образом

    public class AutoMapperProfile : Profile
    {
        public AutoMapperProfile()
        {
            CreateMap<DtoReq, Model>();
            // other mappings
        }
    }
    

    И затем используйте MapperConfigurationExpression следующим образом

    var mce = new MapperConfigurationExpression();
    mce.ConstructServicesUsing(o => MyUnityContainer);
    mce.AddProfiles(new List<Profile>() { new AutoMapperProfile() });
    var mc = new MapperConfiguration(mce);
    mc.CompileMappings(); // prevents lazy compilation
    mc.AssertConfigurationIsValid(); // ensures all mappings are in place
    
  2. Были некоторые сопоставления, которые отсутствовали (только 2), которые работали в более старой версии, вероятно, потому что автоматические сопоставления c были включены в нем по умолчанию. Более новая версия 9.0.0 показала точные отсутствующие сопоставления только после того, как я переместил их в Profile.

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