Programing

매핑 된 멤버를 제외한 모든 대상 멤버를 무시하는 방법은 무엇입니까?

lottogame 2020. 11. 20. 08:25
반응형

매핑 된 멤버를 제외한 모든 대상 멤버를 무시하는 방법은 무엇입니까?


이 질문에 이미 답변이 있습니다.

이를 수행하는 방법이 있습니까? 세 가지 유형에서 매핑하는 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))
            ;

참고URL : https://stackoverflow.com/questions/4367591/how-to-ignore-all-destination-members-except-the-ones-that-are-mapped

반응형