Jus*_*son 8 thread-safety automapper asp.net-mvc-3
我不确定我是否有线程问题.在页面加载时,我正在执行两个Ajax请求,以从第三方API加载一些其他数据.以下是每种方法被调用的内容:
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;
}
Run Code Online (Sandbox Code Playgroud)
有时两种反应都会成功 但是,如果我刷新页面,有时会因以下异常而失败:
Missing type map configuration or unsupported mapping
我可以从成功失败的两个请求转到不进行任何代码更改; 只需刷新页面即可.这是一个线程问题还是我错误地使用了映射器?
nem*_*esv 10
是的,您遇到了线程问题而您正在滥用Automapper配置.从Automapper 入门页面:
如果您使用静态Mapper方法,则每个AppDomain只需要进行一次配置.这意味着放置配置代码的最佳位置是应用程序启动,例如ASP.NET应用程序的Global.asax文件.通常,配置引导程序类在其自己的类中,并且从启动方法调用此引导程序类.
因此,您不应该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);
Run Code Online (Sandbox Code Playgroud)
你应该创建一个映射只有一次每个应用程序的续航时间.所以,将每个特定CreateMap的应用程序移动到app.
您遇到的问题可能与在其他线程调用之前进行映射的竞争有关 Mapper.Reset()