AutoMapper 1.1 CreateMap вызывает NullReferenceException после долгого времени безотказной работы - PullRequest
6 голосов
/ 10 декабря 2010

Я размещаю приложение, которое использует AutoMapper для преобразования некоторых классов в другие.До сегодняшнего дня все шло хорошо.Приложение было размещено в течение примерно 3 месяцев.В промежутке мы выполнили несколько развертываний, в которых приложение было перезапущено, а IIS - нет.

Из ниоткуда приложение начало отказывать, оглядываясь на журналы, которые мы обнаружили, что это является причиной:

    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/. Похоже, что исключение вызвано в этом методе ConfigurationStore.класс AutoMapper.

    private TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
    {
        return _typeMaps.FirstOrDefault(x => x.DestinationType == destinationType && x.SourceType == sourceType);
    }

_typeMaps определяется следующим образом в классе.

    private readonly IList<TypeMap> _typeMaps = new List<TypeMap>();

Если мы проверяем в TypeMap, мы видим, что ссылки x.DestionationType и x.SourceTypeс другими свойствами:

    private readonly TypeInfo _destinationType;
    private readonly TypeInfo _sourceType;

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

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

Похоже, _sourceType и / или _destionationType не имеют значения внезапно!

Кто-нибудь еще сталкивался с этой проблемой и / или кто-нибудь знает возможную причину этогопроблема и как мы можем предотвратить это в будущем?

1 Ответ

1 голос
/ 16 марта 2012

Если можно, Automapper обычно выдает это исключение, когда ему было приказано отобразить что-то, что (как указывает ошибка) равно нулю.

Например, если бы мы сказали:

MyCustomObject myobject = null;
MyNewObject mynewobject = Mapper.Map<MyCustomObject, MyNewObject>(myobject);

Мы получили бы ту же ошибку, так как мы говорим Automapper, что нужно создать новый MyNewObject из нуля MyCustomObject.

Судя по вашему сообщению об ошибке, проблема выглядит как пустая List. От Automapper ожидается набор объектов, которые он может сопоставить с чем-то другим, но список пуст.

Automapper может быть немного сложным, чтобы отследить ошибки, так как ошибка будет выброшена Automapper и будет выглядеть как проблема Automapper. Естественно, проблема в том, что где-то ваш код выбрасывает пустой список для отображения.

Знаете ли вы, если у вас есть какие-либо юнит-тесты, которые вы можете проверить? Если так, проверьте покрытие кода для них (что-то вроде NCover ) и убедитесь, что весь ваш код сопоставления выполняется. Если нет, получите несколько тестов, написанных, чтобы осуществить это.

Альтернативой может быть попытка выполнить ту же операцию на рабочей станции разработки и попытаться воссоздать ситуацию с ошибкой - это может быть таблица базы данных, которая сейчас пуста, или какой-то неуказанный пользовательский ввод.

Включено ли в вашем программном обеспечении ведение журналов, например, Корпоративная библиотека ведение журналов?

Удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...