Automapper не отображает нулевые источники - PullRequest
0 голосов
/ 04 февраля 2020

Я использую Automapper, и мне нужно отобразить список объектов во вложенный объект. У меня есть эти объекты:

public abstract class FooSrcBase
{
}

public class FooSrc : FooSrcBase
{
    public bool Prop { get; set; }
}

public class FooDest
{
    public bool Prop { get; set; }
}

public class FooDestGroup
{
    public FooDest FooDest { get; set; }
}

public class Dest
{
    public FooDestGroup FooDestGroup { get; set; }
}

У меня есть IEnumerable<FooSrc>, который содержит FooSrc объектов (существует много реализаций, и в источнике может существовать только один объект для каждого типа), и мне нужно отобразить его в Dest объект. Мне это нужно из-за сопоставления моделей представления для внешнего интерфейса.

Когда я регистрирую сопоставление следующим образом:

CreateMap<IEnumerable<FooSrc>, Dest>().ForPath(dest => dest.FooDestGroup.FooDest, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));

CreateMap<FooSrc, FooDest>();

Когда я отображаю пустой список, возникает проблема в объекте Dest - FooDestGroup - это экземпляр объекта, который имеет свойство FooDest со значением null.

Как можно сделать свойство Dest FooDestGroup отображенным на null, если Я предоставляю пустой список в качестве источника?

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Это исправило мою проблему:

CreateMap<IEnumerable<FooSrcBase>, Dest>()
    .ForMember(dest => dest.FooDestGroup, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));

CreateMap<FooSrc, FooDestGroup>()
    .ForMember(dest => dest.FooDest, opt => opt.MapFrom(src => src));

CreateMap<FooSrc, FooDest>();
1 голос
/ 04 февраля 2020

Во-первых, вашему абстрактному классу FooSrc понадобится другое имя (конфликтует с вашим конкретным именем класса FooSrc)

Как насчет изменения конструктора в Dest, чтобы избежать проблемы с вложенностью? Automapper может отображать параметр конструктора автоматически, но если вам нужно более продвинутое поведение, вы можете обратиться к https://docs.automapper.org/en/stable/Construction.html

Примерно так должно работать:

public class Dest
{
    public FooGroup FooGroup { get; set; }

    public Dest(FooDest fooDest) 
    {
        FooGroup = new FooGroup { FooDest = fooDest };
    }
}

[..]

Mapper.CreateMap<FooSrc, Dest>();

Mapper.Map<List<Dest>>(listOfFooSrc);
...