Почему автомаппер не отменяет настройку «получить все унаследованное»? - PullRequest
0 голосов
/ 29 мая 2020

Мы отображаем иерархию домена в иерархию Dto и использовали ReverseMap (), чтобы упростить отображение обратно в домен.

Включение всех отдельных производных в сопоставление было довольно раздражающим. Вот почему мы попытались использовать IncludeAllDerived (). Некоторое время это работало хорошо, но через некоторое время у нас появились странные исключения:

System.ArgumentException : Cannot create an instance of abstract type Xxx.Base

После некоторых исследований мы выяснили, что это произошло из-за использования IncludeAllDerived (). Поскольку мы изменили его на явное включение, он снова заработал.

Вопрос, который мы задавали себе, был: «Это IncludeAllDerived или ReverseMap, или Automapper не может обрабатывать абстрактные базовые типы или что-то еще».

1 Ответ

0 голосов
/ 29 мая 2020

Некоторые дальнейшие исследования показали, что проблема была в комбинации IncludeAllDerived и ReverseMap. Если мы повторим IncludeAllDerived после ReverseMap, все будет работать так, как ожидалось. Заблуждение заключается в том, что повторение вызовов Include после ReverseMap не требовалось.

Вот код для воспроизведения (Automapper 9.0.0):

    public abstract class Base { }
    public class Derived: Base { }

    public abstract class BaseDto { }
    public class DerivedDto: BaseDto { }

    [Test]
    public void MappingBase_WithReverseMap_AllDerived()
    {
        var configuration = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Base, BaseDto>()
                .IncludeAllDerived()
                .ReverseMap()
                .IncludeAllDerived(); // doesn't work without repeating IncludeAllDerived() after ReverseMap()

            cfg.CreateMap<Derived, DerivedDto>()
                .ReverseMap();
        });

        var mapper = configuration.CreateMapper();

        BaseDto derivedDto = new DerivedDto();
        var vm = mapper.Map<Base>(derivedDto);

        vm.Should().NotBeNull();
        vm.Should().BeOfType<Derived>();
    }

    [Test]
    public void MappingBase_WithReverseMap_IncludeBase()
    {
        var configuration = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Base, BaseDto>()
                .Include<Derived, DerivedDto>()
                .ReverseMap(); // works without repeating Include() after ReverseMap()

            cfg.CreateMap<Derived, DerivedDto>()
                .ReverseMap();
        });

        var mapper = configuration.CreateMapper();

        BaseDto derivedDto = new DerivedDto();
        var vm = mapper.Map<Base>(derivedDto);

        vm.Should().NotBeNull();
        vm.Should().BeOfType<Derived>();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...