Как отобразить вложенный объект в AutoMpper без использования встроенного отображения или нескольких .ForMember? - PullRequest
3 голосов
/ 23 апреля 2020

Существует вопрос , который описывает то, что я хочу получить очень точно, но они используют встроенное отображение.

Типы источника / назначения

public class SrcInner
{
    public int A {get;set;} // imagine here 100500 properties
}

public class SrcOuter
{
    public int B {get;set;}
    public SrcInner C {get;set}
}

public class Dest
{
    public int A {get;set;} // so here imagine 100500 same properties, as in SrcInner
    public int B {get;set;}
}

Конфигурация сопоставления

public static void AddMapper(this IServiceCollection services)
{
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<SrcInner, Dest>();
        cfg.CreateMap<SrcOuter, Dest>();
    });

    var mapper = config.CreateMapper();

    services.AddSingleton(mapper);
}

Ожидаемое поведение

Свойства A и B заполняются после сопоставления.

Фактическое поведение

Только свойство B заполняется после сопоставления .

Шаги для воспроизведения

public class Foo
{
    IMapper Mapper{get;set;}
    public Foo(IMapper mapper) // comes through dependency injection
    {
        Mapper = mapper;
    }

    public Bar()
    {
        var test = new SrcOuter()
        {
            B = 10;
            C = new SrcInner()
            {
                A = 10;
            }
        }
        var testDest = new Dest();
        mapper.Map(test, Dest);
    }
}

Существует ли правильный способ настройки конфигурации таким образом, чтобы такое сопоставление работало?


ОБНОВЛЕНИЕ

Есть ли способ сопоставить Dest с SrcOuter с заполнением SrcInner?

Ответы [ 2 ]

4 голосов
/ 23 апреля 2020

Документация описывает, как этого можно достичь, используя IncludeMembers здесь

В вашем случае, конфигурация будет:

cfg.CreateMap<SrcOuter, Dest>().IncludeMembers(s => s.C);
cfg.CreateMap<SrcInner, Dest>(MemberList.None);

Если вы хотите это чтобы работать в обоих направлениях, самый идиоматический c способ сделать это состоит в том, чтобы префикс ваших целевых элементов перед именем вложенного исходного объекта, чтобы сглаживание и отстегивание работали автоматически.

Например, если у вас есть следующие объекты:

public class SrcInner
{
    public int A { get; set; }
}

public class SrcOuter
{
    public int B { get; set; }
    public SrcInner Inner { get; set; }
}

public class Dest
{
    public int InnerA { get; set; }
    public int B { get; set; }
}

Вам не нужно больше настроек, чем:

cfg.CreateMap<SrcOuter, Dest>().ReverseMap();
1 голос
/ 23 апреля 2020

Я думаю, вам нужно взглянуть на это: https://docs.automapper.org/en/stable/Projection.html

А затем вам нужно

 .ForMember(dest => dest.A, opt => opt.MapFrom(src => src.C.A))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...