2010-12-10 1 views
5

AutoMapperを使用して特定のクラスを他のクラスに変換するアプリケーションをホストしています。これは今日までうまくいっていた。アプリケーションは現在約3ヶ月間ホスティングされています。その間に、アプリケーションが再起動されたが、IISが再起動していない複数のデプロイが行われました。AutoMapperの1.1 CreateMapは、長い稼働時間の後にNullReferenceExceptionを発生させます。

アプリケーションでは、我々は、これが原因であることが判明ログを振り返ってみると、失敗し始めどこからともなく出てから:

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クラスのこのメソッドで発生しているようです。

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

我々は他のプロパティにx.DestionationTypeとx.SourceType参照ことを確認したTypeMapにチェックした場合:_sourceTypeおよび/または_destionationTypeが突然ヌルアルいるように見えます

private readonly TypeInfo _destinationType; 
    private readonly TypeInfo _sourceType; 

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

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

他の誰かがこの問題に直面したことがありますか、誰かがこの問題の原因を知っていますか、これを今後どのように防ぐことができますか?

答えて

1

場合によっては、Automapperは(エラーが示すように)nullをマップするように指示されている場合、この例外をスローします。例えば

私たちが言っていた場合、:

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

我々はヌルMyCustomObjectから新しいMyNewObjectを作るためにAutomapperを言っているので、私たちは同じエラーを取得します。

エラーメッセージの表示から、問題は空のListのように見えます。 Automapperは、他のものにマップすることができるたくさんのオブジェクトが期待されていますが、リストは空です。

Automapperは、Automapperによってエラーがスローされ、Automapperの問題のように見えるため、エラーを追跡するために少しの豚になることができます。当然、問題はどこかで、あなたのコードがマッピングのために空のリストを投げているということです。

あなたが調べることができる単体テストがあるかどうか知っていますか?その場合は、コード範囲(NCoverなど)を確認し、すべてのマッピングコードが使用されていることを確認してください。そうでなければ、それを行使するために書かれたいくつかのテストを得る。

別の方法として、開発ワークステーションで同じ操作を実行し、エラーが発生した場合の状況を再現してみてください。データベーステーブルが空になっているか、不特定のユーザー入力がある可能性があります。

ソフトウェアでロギングが有効になっていますか。たとえば、Enterprise Libraryロギングのようなものですか?

幸運:)

関連する問題