сопоставление объекта сглаживания с вложенным объектом с помощью AutoMapper (.NET)

#c# #asp.net #attributes #automapper

#c# #asp.net #атрибуты #automapper

Вопрос:

Я хочу сопоставить сглаженный объект с вложенным объектом с помощью AutoMapper, как показано ниже. источник.
Как мы можем это сделать?

содержимое классов Предпочтительно использовать атрибуты класса или свойства для AutoMapper.

 public class Src
{
    public string Value0 { get; set; }
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

[AutoMap(typeof(Src))]
public class Dest
{
    public string Value0 { get; set; }
    public NestedDestChild Child { get; set; }
}

[AutoMap(typeof(Src))]
public class NestedDestChild
{
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}
 

процесс сопоставления (я вырезал точный процесс создания экземпляра Mapper )

 public void ExecuteMapping()
{
    Src srcObj = new Src
    {
        Value0 = "aaa",
        Value1 = "bbb",
        Value2 = "ccc"
    };

    Mapper mapper = new Mapper();
    Dest destObj = mapper.Map<Dest>(srcObj);
    Console.WriteLine(destObj.Value0);       // expected -> aaa
    Console.WriteLine(destObj.Child.Value1); // expected -> bbb
    Console.WriteLine(destObj.Child.Value2); // expected -> ccc
}
 

Я знаю, что приведенный ниже источник будет совместим, но это избыточность.
Я хотел бы отобразить только один раз из Src в Dest.
Итак, я хочу выполнить, как указано выше. источник.

 public void ExecuteMapping()
{
    Src srcObj = new Src
    {
        Value0 = "aaa",
        Value1 = "bbb",
        Value2 = "ccc"
    };

    Mapper mapper = new Mapper();
    Dest destObj = mapper.Map<Dest>(srcObj);
    // ↓I wanna cut this line
    NestedDestChild destObj.Child = mapper.Map<NestedDestChild>(srcObj); 
    Console.WriteLine(destObj.Value0);       // expected -> aaa
    Console.WriteLine(destObj.Child.Value1); // expected -> bbb
    Console.WriteLine(destObj.Child.Value2); // expected -> ccc
}
 

Комментарии:

1. ForMember(dest => dest.Child, options => options.MapFrom(source => source))

Ответ №1:

Вы можете использовать AutoMapper из nuget package manager подробнее об AutoMapper читайте по этой ссылке

ссылка на функциональность AutoMapper

Здесь я попытался сделать его совместимым с вашим примером

         var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Src, NestedDestChild>();
        });

        Src srcObj = new Src
        {
            Value1 = "aaa",
            Value2 = "bbb"
        };
        Dest destObj = new Dest();
        IMapper iMapper = config.CreateMapper();

        var destination = iMapper.Map<Src, NestedDestChild>(srcObj);
        destObj.Child = destination;
        Console.WriteLine(destObj.Child.Value1); // expected -> aaa
        Console.WriteLine(destObj.Child.Value2); // expected -> bbb
 

Излишне говорить, что вам нужно удалить атрибут AutoMap из ваших классов
Я бы рекомендовал создать класс manager, который отвечал бы за сопоставление, и для каждого сопоставления создавайте конфигурацию сопоставления и возвращайте их, когда вам нужно сопоставить

Комментарии:

1. Спасибо. что делать, если я хочу также сопоставить свойство из Src в Dest (я добавил свойство Value0 в вопросе)