2013-04-17 3 views
0

에 기초하여 I 다음 코드를 가지고 값 null 경우 기본적 int? 수분을Automapper : Hydrate int? 조건

[Test] 
public void ConditionalMapping() 
{ 
    var src = new Sample1 {Age = 1, Number = null}; 
    var dest = new Sample2 {Age = null, Number = 1}; 

    Hydrate(src, dest, false); 

    Assert.That(dest.Age, Is.EqualTo(1)); 
    Assert.That(dest.Number, Is.EqualTo(1)); 

    src = new Sample1 {Age = null, Number = 1}; 
    dest = new Sample2 {Age = 1, Number = null}; 

    Hydrate(src, dest, true); 

    Assert.That(dest.Age, Is.Null); 
    Assert.That(dest.Number, Is.EqualTo(1)); 
} 

public void Hydrate(Sample1 src, Sample2 dest, bool allowOverride) 
{ 
    if (!dest.Age.HasValue || allowOverride) 
     dest.Age = src.Age; 

    if (!dest.Number.HasValue || allowOverride) 
     dest.Number = src.Number; 
} 

public class Sample1 
{ 
    public int? Age { get; set; } 
    public int? Number { get; set; } 
} 

public class Sample2 
{ 
    public int? Age { get; set; } 
    public int? Number { get; set; } 
} 

를이 필드의 값을 체크하지 않고 값 수화 것이다하는 allowOverride = true, 그러하지 아니하다.

Automapper에서 어떻게해야합니까?

Automapper's condition gets ignored

을하지만하는 방법을 알아낼 수 없습니다 : :

  1. 없이 int?에 따라 논리를 적용 다음과 같이

    난 당신이 .Condition()를 사용할 수 있다는 것을 알고 그것을 하나씩 정의한다.

  2. Mapper에 부울 값인 allowOverride을 포함합니다.

답변

0

나는 allowOverride 플래그의 작동 방식에 따라 잠재적 인 해결책을 찾았을 수도 있습니다.

Mapper.CreateMap<Sample1, Sample2>(); 
Mapper.CreateMap<int?, int?>().ConvertUsing(new NullableIntConverter(true)); 
Mapper.AssertConfigurationIsValid(); 

그것은 이제 목적지를 확인합니다 : 당신이 플래그는 모든 매핑에 대해 동일한를 조작하려는 경우

public class NullableIntConverter : ITypeConverter<int?, int?> 
{ 
    private bool AllowOverrides { get; set;} 

    public NullableIntConverter(bool allowOverrides) 
    { 
     AllowOverrides = allowOverrides; 
    } 

    public int? Convert(ResolutionContext context) 
    { 
     var source = context.SourceValue as int?; 
     var destination = context.DestinationValue as int?; 
     if (destination.HasValue && !AllowOverrides) 
      return destination; 
     else 
      return source; 
    } 
} 

가 이런 식으로 초기화를 따르는 TypeConverter

당신이 만들 수 있습니다 값을 가져오고 생성자 인수에 따라 적절하게 재정의하십시오.


또는


당신은 당신이 (이 코드는 몇 가지 추가 유효성 검사 할 수 있습니다)를 ValueResolver를 사용할 수 있습니다, 특히 각각의 매핑을 구성 할 수있게하려면 :

public class NullableIntResolver : IValueResolver 
{ 
    public bool AllowOverrides { get; set; } 

    public NullableIntResolver(bool allowOverrides) 
    { 
     AllowOverrides = allowOverrides; 
    } 

    public ResolutionResult Resolve(ResolutionResult source) 
    { 
     // Add validation for source and destination types 
     return source.New(
        ResolveCore((int?) source.Value, 
           DestinationMemberValue(source.Context)), 
        typeof(int?)); 
    } 

    public int? ResolveCore(int? source, int? destination) 
    { 
     if (destination.HasValue && !AllowOverrides) 
      return destination; 
     else 
      return source; 
    } 

    private int? DestinationMemberValue(ResolutionContext context) 
    { 
     var destObject = context.DestinationValue; 
     var destMemberName = context.MemberName; 
     return (int?) destObject 
          .GetType() 
          .GetProperty(destMemberName) 
          .GetValue(destObject, null); 
    } 
} 

당신은 다음과 같이 당신의 매핑을 초기화 할 수 있습니다

var allowOverrides = true; 
Mapper.CreateMap<Sample1, Sample2>() 
    .ForMember(dest => dest.Age, 
       opt => opt.ResolveUsing<NullableIntResolver>() 
       .FromMember(src => src.Age) 
       .ConstructedBy(() => new NullableIntResolver(allowOverrides))) 
    .ForMember(dest => dest.Number, 
       opt => opt.ResolveUsing<NullableIntResolver>() 
       .FromMember(src => src.Number) 
       .ConstructedBy(() => new NullableIntResolver(allowOverrides))); 
Mapper.AssertConfigurationIsValid(); 
+0

나는 이것을 시험해보고 알려줄 것입니다. –