Development Tip

Automapper를 사용하여 목록 매핑

yourdevel 2020. 11. 21. 09:11
반응형

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.

이를 수행하는 올바른 방법은 무엇입니까?


Mapper.CreateMap<Person, PersonViewModel>();
peopleVM = Mapper.Map<List<Person>, List<PersonViewModel>>(people);
Mapper.AssertConfigurationIsValid();

에서가 시작하기 :

AutoMapper는 어떻게 사용합니까?

먼저 작업 할 소스 및 대상 유형이 모두 필요합니다. 대상 유형의 디자인은 그것이 존재하는 레이어의 영향을받을 수 있지만 AutoMapper는 멤버 이름이 소스 유형의 멤버와 일치하는 한 가장 잘 작동합니다. "FirstName"이라는 소스 멤버가있는 경우 이름이 "FirstName"인 대상 멤버에 자동으로 매핑됩니다. AutoMapper는 또한 Flattening을 지원하여 도중에 발생할 수있는 모든 성가신 null 참조 예외를 제거 할 수 있습니다.

유형과 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);

  public IActionResault Index(List<User> users)
  {
    List<VM_User> vM_users=new List<VM_User>();

    vM_users=mapper.Map(users,vM_users);

    return view(vM_users);
  }

참고 URL : https://stackoverflow.com/questions/5589471/mapping-lists-using-automapper

반응형