2011-09-07 9 views
1

これは設計によるものかもしれませんが、automapperが最初にマッピング内のすべてのNullReferenceExceptionsをキャッチして無視するとは思われませんでした。主にMapFromを使用して複雑な表現を作成することがあります。例外がある場合、たとえNullReferenceExceptionであっても、これらのマッピングが失敗することを望みますが、AutoMapperがそれを行うことはできません。 automapperがすべてのケースに対してカスタム値リゾルバを記述することなく、これらの例外をすべて無視しないようにする方法はありますか?これは、私たちのための余分なコードがたくさんあることを意味します。実際には、最初はオートマッパーを使用しないとコードが少なくなるでしょう。AutoMapperがキャッチしてNullReferenceExceptionを無視します

これらは、我々はすべてのパスに期待するテストです:

[TestFixture] 
public class Tests 
{ 
    [SetUp] 
    public void Setup() { Mapper.Reset(); } 

    [Test] 
    public void ShouldThrowMappingExceptionUsingMapFromExpression() 
    { 
     Mapper.CreateMap<Source, Destination>() 
      .ForMember(d => d.DestinationMember, o => o.MapFrom(s => s.SourceMember.SourceProperty)) 
      ; 

     Assert.Throws<AutoMapperMappingException>(() => Mapper.Map<Source, Destination>(new Source())); 
    } 

    [Test] 
    public void ShouldThrowMappingExceptionUsingResolveUsingExpression() 
    { 
     Mapper.CreateMap<Source, Destination>() 
      .ForMember(d => d.DestinationMember, o => o.ResolveUsing(s => s.SourceMember.SourceProperty)) 
      ; 

     Assert.Throws<AutoMapperMappingException>(() => Mapper.Map<Source, Destination>(new Source())); 
    } 

    [Test] 
    public void ShouldThrowMappingExceptionUsingResolverInstance() 
    { 
     Mapper.CreateMap<Source, Destination>() 
      .ForMember(d => d.DestinationMember, o => o.ResolveUsing(new TestValueResolver()).FromMember(s => s.SourceMember)) 
      ; 

     Assert.Throws<AutoMapperMappingException>(() => Mapper.Map<Source, Destination>(new Source())); 
    } 

    [Test] 
    public void ShouldThrowMappingExceptionUsingResolverType() 
    { 
     Mapper.CreateMap<Source, Destination>() 
      .ForMember(d => d.DestinationMember, o => o.ResolveUsing<TestValueResolver>().FromMember(s => s.SourceMember)) 
      ; 

     Assert.Throws<AutoMapperMappingException>(() => Mapper.Map<Source, Destination>(new Source())); 
    } 

} 

public class Destination 
{ 
    public string DestinationMember { get; set; } 
} 

public class Source 
{ 
    public SourceChild SourceMember { get; set; } 
} 

public class SourceChild 
{ 
    public string SourceProperty { get; set; } 
} 

public class TestValueResolver : ValueResolver<SourceChild, string> 
{ 
    protected override string ResolveCore(SourceChild source) 
    { 
     return source.SourceProperty; 
    } 
} 
+0

:-)これはAutoMapperの問題/バグであるならば、あなたはGitHubのサイトでこれを報告することができますか? https://github.com/automapper/automapper/issues –

+0

報告されています! DelegateBasedResolverの独自の実装を挿入する方法があることを期待していましたが、そこにAPIがありますか? – MatteS

+0

なぜそれを交換する必要がありますか? –

答えて