首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoMapper的1.1 CreateMap在长时间正常运行后提高了NullReferenceException

AutoMapper的1.1 CreateMap在长时间正常运行后提高了NullReferenceException
EN

Stack Overflow用户
提问于 2010-12-10 16:35:19
回答 1查看 1.6K关注 0票数 7

我正在托管一个应用程序,该应用程序使用AutoMapper将某些类转换为其他类。直到今天,一切都很顺利。这个应用程序已经被托管了大约3个月。在此期间,我们已经完成了几次部署,其中应用程序已重新启动,但IIS尚未重新启动。

从天而降,应用程序开始失败,回顾日志,我们发现这是原因:

代码语言:javascript
复制
    System.NullReferenceException: Object reference not set to an instance of an object.
   at AutoMapper.Configuration.<>c__DisplayClass13.<FindExplicitlyDefinedTypeMap>b__12(TypeMap x)
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at AutoMapper.Configuration.FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
   at AutoMapper.Configuration.CreateTypeMap(Type source, Type destination, String profileName)
   at AutoMapper.Configuration.CreateMap[TSource,TDestination](String profileName)
   at AutoMapper.Configuration.CreateMap[TSource,TDestination]()
   at AutoMapper.Mapper.CreateMap[TSource,TDestination]()

因此,我们切换到备份服务器,它完全没有这个问题。我们试图通过重启应用程序来解决这个问题,但这并没有帮助。仅重新启动IIS解决了此问题。

我们尝试查看源代码,以找出导致此问题的原因,我们从https://github.com/jbogard/AutoMapper/下载了该源代码。这个异常似乎是在AutoMapper的ConfigurationStore类的这个方法中引起的。

代码语言:javascript
复制
    private TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
    {
        return _typeMaps.FirstOrDefault(x => x.DestinationType == destinationType && x.SourceType == sourceType);
    }

_typeMaps在类中的定义如下。

代码语言:javascript
复制
    private readonly IList<TypeMap> _typeMaps = new List<TypeMap>();

如果我们签入TypeMap,我们会看到x.DestionationType和x.SourceType引用了其他属性:

代码语言:javascript
复制
    private readonly TypeInfo _destinationType;
    private readonly TypeInfo _sourceType;

    public Type SourceType
    {
        get { return _sourceType.Type; }
    }

    public Type DestinationType
    {
        get { return _destinationType.Type; }
    }

看起来_sourceType和/或_destionationType突然都是空的!

其他人有没有遇到过这个问题和/或是否有人知道这个问题的可能原因,以及我们如何防止这种情况在未来发生?

EN

回答 1

Stack Overflow用户

发布于 2012-03-16 23:51:10

如果我可以的话,Automapper通常会抛出这个异常,当它被告知要映射一些空的东西(如错误所示)时。

例如,如果我们说:

代码语言:javascript
复制
MyCustomObject myobject = null;
MyNewObject mynewobject = Mapper.Map<MyCustomObject, MyNewObject>(myobject);

我们会得到同样的错误,因为我们告诉自动映射程序从一个空的MyCustomObject中创建一个新的MyNewObject

从您的错误消息看,这个问题看起来像是一个空的List。Automapper应该是一堆可以映射到其他对象的对象,但这个列表是空的。

Automapper可以像猪一样追踪错误,因为错误将由Automapper抛出,看起来像是一个Automapper问题。当然,问题在于,不知何故,您的代码在映射中抛出了一个空列表。

你知道你是否有任何可以检查的单元测试吗?如果是这样的话,检查它们的代码覆盖率(类似于NCover),并确保您的所有映射代码都在执行。如果没有,请编写一些测试来练习它。

另一种方法可能是尝试在开发工作站上运行相同的操作,并尝试重新创建出现错误的情况-它可能是现在为空的数据库表,或者是一些未指定的用户输入。

您的软件中是否启用了任何日志记录功能,例如Enterprise Library日志记录?

祝你好运:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4406985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档