C\#AutoMapper 사용 방법 총화

13584 단어 c#automapper
본 고 는 AutoMapper 9.0.0 을 바탕 으로 한다.
AutoMapper 는 대상-대상 맵 기 로 한 대상 을 다른 대상 에 투사 할 수 있 습 니 다.
홈 페이지 주소:http://automapper.org/
공식 문서:https://docs.automapper.org/en/latest/
입문 예

public class Foo
{
 public int ID { get; set; }

 public string Name { get; set; }
}

public class FooDto
{
 public int ID { get; set; }

 public string Name { get; set; }
}

public void Map()
{
 var config = new MapperConfiguration(cfg => cfg.CreateMap<Foo, FooDto>());

 var mapper = config.CreateMapper();

 Foo foo = new Foo { ID = 1, Name = "Tom" };

 FooDto dto = mapper.Map<FooDto>(foo);
}
2.등록 Map방법 을 사용 하기 전에 먼저 AutoMapper 에 어떤 종 류 를 매 핑 할 수 있 는 지 알려 야 한다.

var config = new MapperConfiguration(cfg => cfg.CreateMap<Foo, FooDto>());
앱 도 메 인 마다 한 번 만 설정 할 수 있 습 니 다.이 는 설정 코드 를 설치 하 는 가장 좋 은 위 치 는 응용 프로그램 시작 중 입 니 다.예 를 들 어 ASP.NET 응용 프로그램의 Global.sax 파일 입 니 다.
9.0 부터 Mapper.Initialize 방법 은 사용 할 수 없다.
2.1 ProfileProfile 조직 맵 의 또 다른 방식 이다.새 클래스 를 만 들 고 계승 Profile하 며 구조 함수 에 맵 을 설정 합 니 다.

public class EmployeeProfile : Profile
{
 public EmployeeProfile()
 {
  CreateMap<Employee, EmployeeDto>();
 }
}

var config = new MapperConfiguration(cfg =>
{
 cfg.AddProfile<EmployeeProfile>();
});
Profile 내부 의 설정 은Profile 내부 의 맵 에 만 적 용 됩 니 다.루트 설정 에 사용 할 설정 은 모든 생 성 된 맵 에 적 용 됩 니 다.
AutoMapper 도 지정 한 프로그램 에서 Profile로부터 계 승 된 클래스 를 집중 적 으로 스 캔 하여 설정 에 추가 할 수 있다.

var config = new MapperConfiguration(cfg =>
{
 //        
 cfg.AddMaps(System.AppDomain.CurrentDomain.GetAssemblies());
 
 //          (dll   )
 cfg.AddMaps("LibCoreTest");
});
3 설정
3.1 명명 약정
기본적으로 AutoMapper 는 같은 필드 이름 맵 을 기반 으로 대소 문 자 를 구분 하지 않 습 니 다.
그러나 때때로 우 리 는 특수 한 상황 을 처리 해 야 한다.
  • SourceMemberNamingConvention는 소스 유형 명명 규칙
  • 을 나타 낸다.
  • DestinationMemberNamingConvention 목표 유형 명명 규칙
  • LowerUnderscoreNamingConvention PascalCaseNamingConvention 는 AutoMapper 가 제공 하 는 두 가지 명명 규칙 이다.전 자 는 소문 자로 명명 되 고 밑줄 을 포함 하 며 후 자 는 파스 카 명명 규칙(각 단어의 이니셜 대문자)이다.
    원본 유형 과 목표 유형 이 각각 뱀 모양 명명 법 과 낙타 봉 명명 법 을 사용 했다 면 이름 규칙 을 지정 하여 정확하게 매 핑 할 수 있 도록 해 야 한 다 는 것 을 이해 합 니 다.
    
    public class Foo
    {
     public int Id { get; set; }
    
     public string MyName { get; set; }
    }
    
    public class FooDto
    {
     public int ID { get; set; }
    
     public string My_Name { get; set; }
    }
    
    public void Map()
    {
     var config = new MapperConfiguration(cfg =>
     {
      cfg.CreateMap<Foo, FooDto>();
    
      cfg.SourceMemberNamingConvention = new PascalCaseNamingConvention();
      cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention();
     });
    
     var mapper = config.CreateMapper();
    
     Foo foo = new Foo { Id = 2, MyName = "Tom" };
    
     FooDto dto = mapper.Map<FooDto>(foo);
    }
    3.2 설정 가시 성
    기본 적 인 상황 에서 AutoMapper 는 public 구성원 만 매 핑 하지만 사실은 private 속성 을 매 핑 할 수 있 습 니 다.
    
    var config = new MapperConfiguration(cfg =>
    {
     cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.SetMethod.IsPrivate;
     cfg.CreateMap<Source, Destination>();
    });
    주의해 야 할 것 은 이 속성 은 반드시private set을 추가 해 야 하 며,생략 set 해 서 는 안 된다 는 것 이다.
    3.3 전역 속성/필드 필터
    기본 적 인 상황 에서 AutoMapper 는 모든 공공 속성/필드 를 매 핑 하려 고 시도 합 니 다.다음 설정 은 필드 맵 을 무시 합 니 다.
    
    var config = new MapperConfiguration(cfg =>
    {
    	cfg.ShouldMapField = fi => false;
    });
    3.4 접두사 와 접 두 사 를 식별한다
    
    var config = new MapperConfiguration(cfg =>
    {
     cfg.RecognizePrefixes("My");
     cfg.RecognizePostfixes("My");
    }
    3.5 대체 문자
    
    var config = new MapperConfiguration(cfg =>
    {
     cfg.ReplaceMemberName("Ä", "A");
    });
    이 기능 은 우 리 는 기본적으로 사용 할 수 없다.
    4 호출 구조 함수
    어떤 종류,속성의set 방법 은 사유 적 이다.
    
    public class Commodity
    {
     public string Name { get; set; }
    
     public int Price { get; set; }
    }
    
    public class CommodityDto
    {
     public string Name { get; }
    
     public int Price { get; }
    
     public CommodityDto(string name, int price)
     {
      Name = name;
      Price = price * 2;
     }
    }
    AutoMapper 는 해당 구조 함수 호출 을 자동 으로 찾 을 수 있 습 니 다.구조 함수 에서 매개 변 수 를 변경 하면 그 변 화 는 맵 결과 에 반 영 됩 니 다.상례 와 같이 비 친 후 Price 2 를 곱 합 니 다.
    구조 함수 맵 사용 하지 않 기:
    
    public class Commodity
    {
     public string Name { get; set; }
    
     public int Price { get; set; }
    }
    
    public class CommodityDto
    {
     public string Name { get; }
    
     public int Price { get; }
    
     public CommodityDto(string name, int price)
     {
      Name = name;
      Price = price * 2;
     }
    }
    AutoMapper 는 해당 구조 함수 호출 을 자동 으로 찾 을 수 있 습 니 다.구조 함수 에서 매개 변 수 를 변경 하면 그 변 화 는 맵 결과 에 반 영 됩 니 다.상례 와 같이 비 친 후 Price 는 2 를 곱 합 니 다.
    구조 함수 맵 사용 하지 않 기:
    
    var config = new MapperConfiguration(cfg => cfg.DisableConstructorMapping());
    구조 함수 맵 을 사용 하지 않 으 면 목표 클래스 에 무 참 구조 함수 가 있어 야 합 니 다.
    5 배열 과 목록 맵
    배열 과 목록 의 맵 은 비교적 간단 합 니 다.요소 형식 만 설정 하고 간단 한 유형 은 다음 과 같 습 니 다.
    
    public class Source
    {
     public int Value { get; set; }
    }
    
    public class Destination
    {
     public int Value { get; set; }
    }
    맵:
    
    var config = new MapperConfiguration(cfg =>
    {
     cfg.CreateMap<Source, Destination>();
    });
    IMapper mapper = config.CreateMapper();
    
    var sources = new[]
    {
     new Source { Value = 5 },
     new Source { Value = 6 },
     new Source { Value = 7 }
    };
    
    IEnumerable<Destination> ienumerableDest = mapper.Map<Source[], IEnumerable<Destination>>(sources);
    ICollection<Destination> icollectionDest = mapper.Map<Source[], ICollection<Destination>>(sources);
    IList<Destination> ilistDest = mapper.Map<Source[], IList<Destination>>(sources);
    List<Destination> listDest = mapper.Map<Source[], List<Destination>>(sources);
    Destination[] arrayDest = mapper.Map<Source[], Destination[]>(sources);
    구체 적 으로 지원 하 는 소스 집합 유형 은 다음 과 같다.
  • IEnumerable
  • IEnumerable
  • ICollection
  • ICollection
  • IList
  • IList
  • List
  • Arrays
  • 기 존 집합 에 비 추 면 우선 목표 집합 을 제거 합 니 다.만약 이것 이 당신 이 원 하 는 것 이 아니라면,AutoMapper.collection 을 보십시오.
    5.1 빈 집합 처리
    집합 속성 을 매 핑 할 때 원본 값 이null이면 AutoMapper 는 대상 필드 를 빈 집합 으로 매 핑 합 니 다null.이 는 Entity Framework 와 Framework Design Guidelines 의 행동 과 일치 하 며,C#참조,배열,List,Collection,Dictionary 와 IEnumerables 는 영원히 null가 되 어 서 는 안 된다 고 주장 한다.
    5.2 집합 중의 다 형
    이 공식 문 서 는 잘 이해 되 지 않 는 다.다시 예 를 들 겠 습 니 다.실체 클래스 는 다음 과 같 습 니 다.
    
    public class Employee
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    }
    
    public class Employee2 : Employee
    {
     public string DeptName { get; set; }
    }
    
    public class EmployeeDto
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    }
    
    public class EmployeeDto2 : EmployeeDto
    {
     public string DeptName { get; set; }
    }
    배열 맵 코드 는 다음 과 같 습 니 다:
    
    var config = new MapperConfiguration(cfg =>
    {
     cfg.CreateMap<Employee, EmployeeDto>().Include<Employee2, EmployeeDto2>();
     cfg.CreateMap<Employee2, EmployeeDto2>();
    });
    IMapper mapper = config.CreateMapper();
    
    var employees = new[]
    {
     new Employee { ID = 1, Name = "Tom" },
     new Employee2 { ID = 2, Name = "Jerry", DeptName = "R & D" }
    };
    
    var dto = mapper.Map<Employee[], EmployeeDto[]>(employees);
    비 친 후에 dto 에서 두 가지 요소 의 유형 을 볼 수 있 습 니 다.하 나 는 EmployeeDto 이 고 하 나 는 EmployeeDto 2 입 니 다.즉,부모 클래스 가 부모 클래스 에 비 친 것 을 실현 하고 하위 클래스 가 하위 클래스 에 비 친 것 입 니 다.
    Include 방법 을 제거 하면 맵 후 dto 의 두 요소 의 유형 은 모두 EmployeDto 입 니 다.
    6.속성 맵 까지 방법
    AutoMapper 는 속성 맵 뿐만 아니 라 속성 맵 까지 방법 을 실현 할 수 있 으 며 어떠한 설정 도 필요 하지 않 습 니 다.방법 명 은 속성 명 과 일치 할 수도 있 고Get 접 두 사 를 가 질 수도 있 습 니 다.
    예 를 들 어 다음 예Employee.GetFullName() 방법 은EmployeeDto.FullName 속성 에 투사 할 수 있다.
    
    public class Employee
    {
     public int ID { get; set; }
    
     public string FirstName { get; set; }
    
     public string LastName { get; set; }
    
     public string GetFullName()
     {
      return $"{FirstName} {LastName}";
     }
    }
    
    public class EmployeeDto
    {
     public int ID { get; set; }
    
     public string FirstName { get; set; }
    
     public string LastName { get; set; }
    
     public string FullName { get; set; }
    }
    7 사용자 정의 맵
    원본 형식 이 대상 형식 이름과 일치 하지 않 거나 원본 데 이 터 를 변환 해 야 할 때 사용자 정의 맵 을 사용 할 수 있 습 니 다.
    
    public class Employee
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public DateTime JoinTime { get; set; }
    }
    
    public class EmployeeDto
    {
     public int EmployeeID { get; set; }
    
     public string EmployeeName { get; set; }
    
     public int JoinYear { get; set; }
    }
    상례 와 같이IDEmployeeID속성 명 이 다 르 고JoinTime JoinYear속성 명 이 다 를 뿐만 아니 라 속성 유형 도 다르다.
    
    var config = new MapperConfiguration(cfg =>
    {
     cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember("EmployeeID", opt => opt.MapFrom(src => src.ID))
      .ForMember(dest => dest.EmployeeName, opt => opt.MapFrom(src => src.Name))
      .ForMember(dest => dest.JoinYear, opt => opt.MapFrom(src => src.JoinTime.Year));
    });
    8 편평 화 영사
    대상-대상 맵 의 흔 한 용법 중 하 나 는 복잡 한 대상 모델 을 더 간단 한 모델 로 펴 는 것 이다.
    
    public class Employee
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public Department Department { get; set; }
    }
    
    public class Department
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    }
    
    public class EmployeeDto
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public int DepartmentID { get; set; }
    
     public string DepartmentName { get; set; }
    }
    대상 유형의 속성 이 원본 유형의 속성,방법 과 대응 하지 않 으 면 AutoMapper 는 대상 멤버 명 을 낙타 봉 법 에 따라 하나의 단어 로 분해 하여 일치 합 니 다.예 를 들 어 상례 에서 EmployeDto.Department ID 는 Employee.Department.ID 에 대응 합 니 다.
    8.1 IncludeMembers
    만약 속성 이름 이 상기 규칙 에 부합 되 지 않 고 아래 와 같다 면:
    
    public class Employee
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public Department Department { get; set; }
    }
    
    public class Department
    {
     public int DepartmentID { get; set; }
    
     public string DepartmentName { get; set; }
    }
    
    public class EmployeeDto
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public int DepartmentID { get; set; }
    
     public string DepartmentName { get; set; }
    }
    Department 클래스 의 속성 명 은 EmployeeDto 클래스 의 속성 명 과 직접 일치 하면 IncludeMembers 방법 으로 지정 할 수 있다.
    9 내장 맵
    때때로 우 리 는 평평 하 게 펼 필요 가 없 을 수도 있다.다음 과 같은 예 를 보십시오.
    
    public class Employee
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public int Age { get; set; }
    
     public Department Department { get; set; }
    }
    
    public class Department
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public string Heads { get; set; }
    }
    
    public class EmployeeDto
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    
     public DepartmentDto Department { get; set; }
    }
    
    public class DepartmentDto
    {
     public int ID { get; set; }
    
     public string Name { get; set; }
    }
    우 리 는Employee EmployeeDto에 투사 하고 Department DepartmentDto에 투사 해 야 한다.
    
    var config = new MapperConfiguration(cfg =>
    {
     cfg.CreateMap<Employee, EmployeeDto>();
     cfg.CreateMap<Department, DepartmentDto>();
    });
    이상 은 C\#AutoMapper 사용 방법 에 대한 상세 한 내용 입 니 다.C\#AutoMapper 용법 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기