매핑 된 멤버를 제외한 모든 대상 멤버를 무시하는 방법은 무엇입니까?
이 질문에 이미 답변이 있습니다.
- AutoMapper : "나머지 무시"? 16 답변
이를 수행하는 방법이 있습니까? 세 가지 유형에서 매핑하는 SummaryDto가 있으며 각 유형에 대한 맵을 만들 때 매핑되지 않은 소품은 오류를 발생시킵니다. 요약 dto에는 약 35 개의 속성이 있습니다. Ignore () 옵션을 각각 사용하는 것은 너무 많은 문제입니다. 글로벌 무시가 있습니까? 같은 것
CreateMap<Source,Target>()
.IgnoreAllUnmapped();
이것은 나를 위해 일하고 있습니다.
public static class MappingExpressionExtensions
{
public static IMappingExpression<TSource, TDest> IgnoreAllUnmapped<TSource, TDest>(this IMappingExpression<TSource, TDest> expression)
{
expression.ForAllMembers(opt => opt.Ignore());
return expression;
}
}
때문에 ForAllMembers
반환 void
호출 ForAllMembers(o => o.Ignore())
이 확장 방법없이이 작동하지 않을 것입니다. 후속 매핑을 활성화하기 위해 매핑 표현식을 계속 사용할 수 있습니다.
CreateMap<Source, Destination>()
.IgnoreAllUnmapped()
.ForMember(d => d.Text, o => o.MapFrom(s => s.Name))
.ForMember(d => d.Value, o => o.MapFrom(s => s.Id));
나는 이것과 꽤 오랫동안 또는 적어도 이와 비슷한 문제로 고생했습니다. 많은 속성 (약 30 개)이 포함 된 클래스가 있었고 그중 4 개만 매핑하고 싶었습니다. 26 개의 ignore 문을 추가하는 것은 미친 것처럼 보입니다 (특히 클래스에 대한 향후 변경 사항이이를 업데이트해야 함을 의미 할 때).
마침내 AutoMapper에게 모든 것을 무시하고 내가 원하는 것을 명시 적으로 추가하도록 지시 할 수 있음을 발견했습니다.
// Create a map, store a reference to it in a local variable
var map = CreateMap<Source,Target>();
// Ignore all members
map.ForAllMembers(opt => opt.Ignore());
// Add mapping for P1
map.ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));
// Add other mappings...
map.ForMember(dest => dest.P2, opt => opt.MapFrom( src => src.P2));
map.ForMember(dest => dest.P3, opt => opt.MapFrom( src => src.P3));
map.ForMember(dest => dest.P4, opt => opt.MapFrom( src => src.P4));
이 작업을 수행 할 수 있다고 생각하면 용서받을 수 있습니다 (하지만 컴파일되지 않기 때문이 아닙니다).
// This won't compile
CreateMap<Source,Target>()
.ForAllMembers(opt => opt.Ignore())
.ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));
이것이 작동하지 않는 이유는 ForAllMembers () 메서드가 (적어도 현재 버전 2.0에서는) 유창한 체인 스타일을 지원하지 않기 때문입니다.
좋은 소식은 비체 인 버전이 실제로 작동한다는 것입니다. 물론 한 가지주의 할 점은 매핑 할 멤버를 AutoMapper에 명시 적으로 알려야한다는 것입니다. 묵시적 매핑을 계속 사용하고 손상된 매핑을 무시할 수 있도록 두 가지 방법을 모두 사용할 수있는 쉬운 방법을 아직 찾지 못했습니다.
매핑 된 속성을 명시 적으로 지정하지 않으려면 IgnoreAllNonExisting 을 사용할 수 있습니다 . 매핑 된 소스 속성이없는 대상 속성은 무시됩니다.
.ConvertUsing()
귀하의 경우 에 사용 하십시오.
CreateMap<Source,Target>()
.ConvertUsing(converter=> new Target(){
P1 = converter.P1,
....
});
따라서 개체에 포함하려는 모든 속성을 설명 할 수 있으며 다른 속성은 무시됩니다.
ForAllMembers 메서드에 대한 유창한 구문을 허용하는 확장 메서드 :
public static IMappingExpression<TSource, TDestination> IgnoreAllMembers<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> expression
)
{
expression.ForAllMembers(opt => opt.Ignore());
return expression;
}
용법:
IgnoreAllMembers에 대한 호출은 ForMember에 대한 호출 이전이어야합니다.
CreateMap<LocationRevision, Dto.LocationAddressMap>()
.IgnoreAllMembers()
.ForMember(m => m.LocationId, opt => opt.MapFrom(src => src.Id))
;
'Programing' 카테고리의 다른 글
jQuery : print_r () 동등한 표시? (0) | 2020.11.20 |
---|---|
HttpWebRequest 클래스가 보내는 원시 HTTP 요청을 어떻게 볼 수 있습니까? (0) | 2020.11.20 |
delayed_jobs vs resque vs beanstalkd? (0) | 2020.11.20 |
Android의 R 클래스 이해 (0) | 2020.11.20 |
여러 Git 커밋 (이미 푸시 됨)을 게시 된 저장소로 되돌리려면 어떻게해야합니까? (0) | 2020.11.20 |