2011-09-07 110 views
1

也许这是设计,但我们最初并不期望automapper捕获并忽略映射中的所有NullReferenceExceptions。我们主要使用MapFrom并创建有时候复杂的表达式。我们希望这些映射失败,如果有任何异常,即使是NullReferenceException,但我们不能让AutoMapper来做到这一点。有没有办法让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

为什么你需要替换? –

回答