C\#AutoMapper 사용 방법 총화
13584 단어 c#automapper
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 Profile
Profile
조직 맵 의 또 다른 방식 이다.새 클래스 를 만 들 고 계승 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);
구체 적 으로 지원 하 는 소스 집합 유형 은 다음 과 같다.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; }
}
상례 와 같이ID
과EmployeeID
속성 명 이 다 르 고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 용법 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.