Я предпочитаю избегать старых статических методов и делаю это так.
Поместите наши определения сопоставления в Профиль . Сначала мы сопоставляем Корень, а затем применяем сопоставления Вложенных. Обратите внимание на использование Context .
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Root, Flattened>()
.AfterMap((src, dest, context) => context.Mapper.Map(src.TheNestedClass, dest));
CreateMap<Nested, Flattened>();
}
}
Преимущество определения сопоставления от Корень до Сглаженный и Вложенный до Плоский * заключается в том, что вы сохраняете полный контроль над сопоставление свойств, например, если имя свойства назначения отличается или вы хотите применить преобразование и т. д.
Тест XUnit:
[Fact]
public void Mapping_root_to_flattened_should_include_nested_properties()
{
// ARRANGE
var myRoot = new Root
{
AParentProperty = "my AParentProperty",
TheNestedClass = new Nested
{
ANestedProperty = "my ANestedProperty"
}
};
// Manually create the mapper using the Profile
var mapper = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile())).CreateMapper();
// ACT
var myFlattened = mapper.Map<Root, Flattened>(myRoot);
// ASSERT
Assert.Equal(myRoot.AParentProperty, myFlattened.AParentProperty);
Assert.Equal(myRoot.TheNestedClass.ANestedProperty, myFlattened.ANestedProperty);
}
При добавлении serviceCollection.AddAutoMapper () AutoMapper из пакета AutoMapper.Extensions.Microsoft.DependencyInjection к вашему запуску профиль будет выбран автоматически, и вы сможете просто вставьте IMapper туда, где вы применяете сопоставление.