【问题标题】:Automapper ignoring Null Reference ExceptionAutomapper 忽略空引用异常
【发布时间】:2022-06-25 05:22:51
【问题描述】:

问题

AutoMapper v10.1.1

我有一个 AutoMapper 配置文件,它需要来自其源的扩展方法(在本例中为 NickName())才能完成映射。这个方法会故意抛出一个 NullReferenceException 来说明 AutoMapper 似乎正在吞噬这个异常。从我的服务 (MyService) 调用映射器时,它永远不会被引发。

示例

来电

mapper.Map<Person>(person) 

将返回一个填充了 Name 属性并将 NickName 属性设置为 null 的 Person 对象,尽管在映射过程中引发了 NullReferenceException。

映射配置文件

public class PersonMappingProfile : Profile
{
  CreateMap<DataStorePerson, Person>()
    .ForMember(destinationMember => destinationMember.Name, options => options.MapFrom(source => source.Name))
    .ForMember(destinationMember => destinationMember.NickName, options => options.MapFrom(source => source.NickName()));
}

服务

public class MyService()
{
   private IMapper mapper;

   public MyService(IMapper mapper)
   {
      this.mapper = mapper;
   }
   
   public Person GetPerson()
   {
       var person = dataStore.GetPerson();
       return mapper.Map<Person>(person); // EXPECTED NULL REF EXCEPTION to be thrown here
   }
}

扩展方法

public static class PersonExtensions
{
   public static string NickName(this DataStorePerson person)
   {
      throw new NullRefenceException("This exception is swallowed by AutoMapper");
   }   
}

如何让 AutoMapper 将异常抛回给调用者?

【问题讨论】:

  • 只是不要使用扩展方法。
  • 有什么特别的原因吗?
  • 我已经把你的问题句移到了一个明显的地方。乍一看很像错误报告,因为我找不到问题。

标签: c# automapper


【解决方案1】:

根据AutoMapper docs,吞下空引用异常是设计使然,但是已经提到了一种解决方法:

在将源映射到目标时,AutoMapper 将忽略空引用异常。这是设计使然。如果您不喜欢这种方法,可以根据需要将 AutoMapper 的方法与自定义值解析器结合使用。

【讨论】:

    【解决方案2】:

    如果对扩展方法的调用被包装在 ValueResolver 中,我可以获得引发空引用异常的唯一方法。见Automapper Value Resolvers ....我的映射配置文件然后有这个代码.ForMember(destinationMember =&gt; destinationMember.NickName, options =&gt; options.MapFrom&lt;MyCustomResolver&gt;();

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2011-03-13
      相关资源
      最近更新 更多