2012-03-23 15 views
7

ここにスレッドの問題があるかどうかわかりません。ページのロード時に、サードパーティのAPIからいくつかの追加データを読み込むための2つのAjaxリクエストを実行しています。AutoMapperスレッドの問題(型マップの設定が欠落しているか、サポートされていないマッピング)?

private List<CaseCommentModel> GetCaseCommentModels(string caseId) { 
    var comments = CaseService.GetAllCaseCommentsByCaseId(caseId); 

    Mapper.Reset(); 
    Mapper.CreateMap<CrmCaseComment, CaseCommentModel>(); 

    var caseCommentModels = Mapper.Map<List<CrmCaseComment>, List<CaseCommentModel>>(comments); 

    return caseCommentModels; 
} 

private List<CaseAttachmentModel> GetCaseAttachmentModels(string caseId) { 
    var attachments = AttachmentService.GetAttachmentsByParentId(caseId); 

    Mapper.Reset(); 
    Mapper.CreateMap<CrmAttachment, CaseAttachmentModel>(); 

    var caseAttachmentModels = Mapper.Map<List<CrmAttachment>, List<CaseAttachmentModel>>(attachments); 

    return caseAttachmentModels; 
} 

時には両方の応答が成功する場合があります。私はページを更新した場合でも、時には1は、次の例外で失敗します:

Missing type map configuration or unsupported mapping

私は、任意のコードを変更せずに1回の失敗に続く両方の要求から行くことができます。それが必要なのはページのリフレッシュだけです。これはスレッドの問題ですか、またはmapperを間違って使用していますか?

答えて

5

マッピングを作成するのは、で、1回のアプリケーションライフタイムあたりにする必要があります。したがって、それぞれの具体的なCreateMapをアプリの開始に移動します。

発生している問題は、おそらく他のスレッドがはい、あなたがスレッドの問題を持っていて、Automapper設定を悪用しているMapper.Reset()

10

を呼び出す前に、マッピングを行うには、レースに関連しています。 Automapper getting started pageから :

静的マッパーメソッドを使用している場合は、設定だけ する必要があるがAppDomainに一回起こります。つまり、 構成コードを置くのに最適な場所は、ASP.NETアプリケーション用のGlobal.asax ファイルなど、アプリケーションの起動時です。通常、コンフィギュレーション bootstrapperクラスは独自のクラスに属しています。このブートストラップクラスは起動メソッドから呼び出された です。

コントローラのアクション内にMapper.CreateMapを置いて共通の場所に移動して一度実行しないでください。

それとも、「手で」設定とエンジンを構築する代わりに、静的Mapperを使用しない動的マッピングの設定が必要です場合:

var config = 
    new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 
config.CreateMap<CrmCaseComment, CaseCommentModel>(); 
var engine = new MappingEngine(config); 
var caseCommentModels = 
    engine.Map<List<CrmCaseComment>, List<CaseCommentModel>>(comments); 
+0

+1動的構成 – zidane

1

私はスレッド問題に出くわしたと希望私の発見を共有する。私のアプリケーションで

WCFサービスコンストラクタで私はAutoMapperRegistryと呼ばれます。オートマッパーのマッピングを作成するには、を設定します。

MVCコントローラから私は、WCFサービスのシングルトンオブジェクトを呼び出すことにより、サービスを呼び出します。両方のサービスに伝達し、その結果を返すよう

実際の問題Webクライアントから私は実際にasyncrounusly 2のコントローラメソッドのと呼ばれています。最初のメソッドをのAsync falseに変更した瞬間、問題が解決しました競合状態が自己時々このスレッドの問題は、上記の例外がスローされ、結果として作成され、それによって解決さたまにを発生し、非同期(async)の両方のメソッドが呼び出される

理由。

0

はい、スレッドの問題があります。私の意見では、AutoMapperから静的APIを使用しないようにすることが最善の解決策です。

builder 
    .Register(c => new MapperConfiguration(cfg => { 
     cfg.AddProfile<AutoMapperProfile>(); 
    })) 
    .SingleInstance(); 
builder 
    .Register(c => c.Resolve<MapperConfiguration>().CreateMapper()) 
    .As<AutoMapper.IMapper>(); 

は、私は、単一のインスタンスとしてMapperConfigurationを作成することに注意してください(私の場合にはAutofac) // IoCの登録:

は、私はあなたがfollwoing方法でautomapperを設定し提案します。 クラスAutoMapperProfile.csには、オートマトンの構成が含まれています。

class AutoMapperProfile : Profile 
{ 
    public AutoMapperProfile() 
    { 
     CreateMap<Source, Destination>(); 
     // usual configurations... 
    } 
}