#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 в вопросе)