Почему Automapper не наследует ForPath-ignores? - PullRequest
1 голос
/ 27 мая 2020

Мы сопоставляем иерархию доменов с иерархией Dto. Некоторые свойства базового класса домена сглаживаются. Мы используем ReverseMap, чтобы упростить отображение обратно в домен из dto.

Мы сопоставили Contended.Id do ContainId of Dto и проигнорировали путь для обратной карты. То, что мы ожидали, это отображение обратно на объект домена не должно создавать новые экземпляры для Contended-property. Но это было не так. После некоторых исследований мы выяснили, что это произошло из-за того, что не унаследовал .ForPath (, opt => opt.Ignore ()) для ReverseMap.

Мы используем версию 9.0.0 Automapper .

Вот код:

    public class Contained {
        public Guid Id { get; set;  }
    }
    public class Base {
        public Contained Contained { get; set;}
    }
    public class Derived: Base { }

    public abstract class BaseDto {
        public Guid? ContainedId { get; set; }
    }
    public class DerivedDto: BaseDto { }

    [Test]
    public void ForPathInheritanceWorks()
    {
        var configuration = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Base, BaseDto>()
                .IncludeAllDerived()
                .ReverseMap()
                .ForPath(d => d.Contained.Id, opt => opt.Ignore());
            cfg.CreateMap<Derived, DerivedDto>()
                .ReverseMap();
        });

        var mapper = configuration.CreateMapper();

        var derived = mapper.Map<Derived>(new DerivedDto());

        Assert.That(derived.Contained, Is.Null); // fails, because derived.Contained is not null.
    }

Чтобы обойти проблему, нам пришлось добавить

.ForPath(d => d.Contained.Id, opt => opt.Ignore())

после ReverseMap производного класса.

Для меня это похоже на ошибку в Automapper.

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