AutoMapper线程问题(缺少类型映射配置或不支持的映射)?

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)


dot*_*joe 6

你应该创建一个映射只有一次每个应用程序的续航时间.所以,将每个特定CreateMap的应用程序移动到app.

您遇到的问题可能与在其他线程调用之前进行映射的竞争有关 Mapper.Reset()