Подтвердить что ты не робот

AutoMapper определяет уровень отображения

public class Foo
{
    public string Baz { get; set; }
    public List<Bar> Bars { get; set; }
}

Когда я сопоставляю класс выше, есть ли способ определить, насколько я хочу, чтобы automapper отображал объекты? Некоторые псевдо-коды того, что мне нужно:

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 0 });
// result = { Baz: "" }

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 1 });
// result = { Baz: "", Bars: [{ Blah: "" }] }

 var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 2 });
// result = { Baz: "", Bars: [{ Blah: "", Buzz: [{ Baz: "" }] }] }

// etc...

В настоящее время я использую automapper 3.3 из-за зависимости nuget.

4b9b3361

Ответ 1

Вы можете сделать это, предоставив значение во время выполнения, на которое был дан ответ: Как игнорировать свойство на основе условия выполнения?.

Конфигурация:

Mapper.CreateMap<Foo, FooDTO>().ForMember(e => e.Bars,
    o => o.Condition(c => !c.Options.Items.ContainsKey("IgnoreBars")));

Применение:

Mapper.Map<FooDTO>(foo, opts => { opts.Items["IgnoreBars"] = true; });

Такой же подход к настройке, который вы можете применить для всех ваших вложенных объектов, которые вы называете уровнями.

Если вы хотите достичь такого же поведения для своих сущностей DB, вы можете использовать подход ExplicitExpansion, как описано в этом ответе: Можно ли сказать automapper игнорировать отображение во время выполнения?.

Конфигурация:

Mapper.CreateMap<Foo, FooDTO>()
    .ForMember(e => e.Bars, o => o.ExplicitExpansion());

Применение:

dbContext.Foos.Project().To<FooDTO>(membersToExpand: d => d.Bars);

Ответ 2

Вы можете определить конкретную карту MaxDepth как:

Mapper.CreateMap<Source, Destination>().MaxDepth(1);

Дополнительная информация: https://github.com/AutoMapper/AutoMapper/wiki