2010-12-10 6 views
5

Ich hosste eine Anwendung, die AutoMapper verwendet, um bestimmte Klassen in andere zu konvertieren. Das lief bis heute gut. Die Anwendung wurde jetzt für ca. 3 Monate gehostet. Zwischendurch haben wir mehrere Deploys durchgeführt, bei denen die Anwendung neu gestartet wurde, aber IIS nicht.AutoMapper 1.1 CreateMap löst NullReferenceException nach langer Betriebszeit

aus dem Nichts die Anwendung gestartet wird, scheitern an den Protokollen im Rückblick fanden wir heraus, dass dies die Ursache ist:

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]() 

So wir unseren Backup-Server eingeschaltet, die dieses Problem nicht haben an alle. Wir haben versucht, das Problem durch einen Neustart der Anwendung zu beheben, was nicht geholfen hat. Nur Neustart von IIS behebt das Problem.

Wir haben versucht, in der Quelle zu suchen, um herauszufinden, was dieses Problem verursacht, die wir unter https://github.com/jbogard/AutoMapper/ heruntergeladen haben. Die Ausnahme scheint in dieser Methode der ConfigurationStore-Klasse von AutoMapper verursacht zu werden.

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

_typeMaps ist in der Klasse wie folgt definiert.

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

Wenn wir im TypeMap überprüfen wir sehen, dass die x.DestionationType und x.SourceType Bezug auf andere Eigenschaften:

private readonly TypeInfo _destinationType; 
    private readonly TypeInfo _sourceType; 

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

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

Es ist wie _sourceType sieht und/oder _destionationType sind null al die plötzlich!

Hat jemand anderes dieses Problem und/oder kennt jemand eine mögliche Ursache für dieses Problem und wie können wir verhindern, dass dies in der Zukunft geschieht?

Antwort

1

Wenn ich darf, wird Automapper in der Regel diese Ausnahme auslösen, wenn es angewiesen wurde, etwas zuzuordnen, das (wie der Fehler anzeigt) null ist.

Zum Beispiel, wenn wir sagen:

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

Wir würden den gleichen Fehler, da wir AutoMapper doch sagen, MyCustomObject eine neue MyNewObject aus einem null zu machen.

Aus der Optik Ihrer Fehlermeldung sieht das Problem wie eine leere List. Automapper erwartet eine Menge von Objekten, die er auf etwas anderes abbilden kann, aber die Liste ist leer.

Automapper kann ein bisschen ein Schwein sein, um Fehler aufzuspüren, da der Fehler von Automapper geworfen wird und wie ein Automapper-Problem aussieht. Natürlich ist das Problem, dass Ihr Code irgendwo eine leere Liste zum Mapping wirft.

Wissen Sie, ob Sie irgendwelche Komponententests haben, die Sie untersuchen können? Wenn dies der Fall ist, überprüfen Sie die Code-Abdeckung für sie (so etwas wie NCover) und stellen Sie sicher, dass alle Ihre Mapping-Code ausgeübt wird. Wenn nicht, lassen Sie einige Tests schreiben, um es auszuüben.

Eine Alternative könnte sein, den gleichen Vorgang auf einer Entwicklungs-Workstation auszuführen und zu versuchen, die Situation mit dem Fehler neu zu erstellen - es könnte eine leere Datenbanktabelle oder eine nicht angegebene Benutzereingabe sein.

Haben Sie eine Protokollierung in Ihrer Software aktiviert, so zum Beispiel Enterprise Library Protokollierung?

Viel Glück :)

Verwandte Themen