AutoMapper捕获并忽略NullReferenceException

本文关键字:NullReferenceException AutoMapper | 更新日期: 2023-09-27 18:07:55

也许这是设计的原因,但我们最初并没有期望automapper捕获并忽略映射中的所有nullreferenceexception。我们主要使用MapFrom,有时创建复杂的表达式。我们希望这些映射在出现任何异常时失败,即使是NullReferenceException,但是我们不能让AutoMapper那样做。是否有任何方法可以使automapper不忽略所有这些异常,而不必为每个情况编写自定义值解析器?这对我们来说意味着大量的额外代码,事实上,如果不首先使用automapper,可能会减少代码。

这些是我们期望所有人都能通过的测试:

[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;
    }
}

AutoMapper捕获并忽略NullReferenceException

此行为现已在AutoMapper中更改!: -)

https://github.com/AutoMapper/AutoMapper/issues/122