Отображение списков с помощью Automapper
у меня есть классы:
public class Person{ /* Props here */ }
public class PersonViewModel { /* Props here */ }
список:
List<Person> people = new List<Person>();
List<PersonViewModel> peopleVM = Mapper
.MapList<Person, PersonViewModel>(people); //Problem here.
Как правильно это сделать?
5 ответов:
Mapper.CreateMap<Person, PersonViewModel>(); peopleVM = Mapper.Map<List<Person>, List<PersonViewModel>>(people); Mapper.AssertConfigurationIsValid();как я могу использовать AutoMapper? Во-первых, вам нужен как источник, так и тип назначения для работы. На дизайн целевого типа может влиять слой, в котором он живет, но AutoMapper работает лучше всего, если имена членов совпадают с членами исходного типа. Если у вас есть исходный элемент с именем "FirstName", он будет автоматически сопоставлен с целевым элементом с именем"FirstName". AutoMapper также поддерживает уплощение, которое может избавиться от всех этих надоедливых пустая ссылка исключений, с которыми вы можете столкнуться на этом пути.
Если у вас есть свои типы и ссылка на AutoMapper, вы можете создать карту для двух типов.
Mapper.CreateMap<Order, OrderDto>();тип слева-это тип источника, а тип справа-тип назначения. Для выполнения сопоставления используйте метод Map.
OrderDto dto = Mapper.Map<Order, OrderDto>(order);
Другое Решение
List<Person> people = new List<Person>(); List<PersonViewModel> peopelVM; peopelVM = people.Select(Mapper.Map<Person, PersonViewModel>);и в конфигурации Automapper
Mapper.CreateMap<Person, PersonViewModel>();
Если вы используете списки IQueryable здесь (от EF или NH, например), вы можете использовать AutoMapper.Методы IQueryableExtensions, Project () и To ().
Это мой первый раз с AutoMapper, но я преуспеваю, создавая карту только для модели:
Mapper.CreateMap<Person, PersonViewModel>(); Mapper.AssertConfigurationIsValid();а затем с помощью методов Iqueryableextension Project () и To ():
using AutoMapper.QueryableExtensions; ... IQueryable<Person> people = new List<Person>().AsQueryable(); //actually from ORM IQueryable<PersonViewModel> peopleVM = people.Project().To<PersonViewModel>();
в ядре 1.1 это расширение может работать:
public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source) { return source.Select(x => mapper.Map<TDestination>(x)).ToList(); }
вы могли бы создать метод расширения, чтобы сделать что-то подобное, используя существующие сопоставления для отдельных элементов:
public static class AutoMapperExtensions { public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source) { return mapper.Map<List<TDestination>>(source); } }использование:
List<PersonViewModel> peopleVM = _mapper.MapList<PersonViewModel>(people);
Comments