AutoMapper中的Mapper.Map线程安全吗?

Ale*_*nin 31 .net asp.net-mvc automapper

我现在正在查找AutoMapper代码(为我正在研究的项目之一进行评估),坦率地说,我很惊讶:

  • 库API基于单个静态访问点(Mapper类型),因此通常其任何方法都必须是线程安全的
  • 但是我没有在代码中找到任何证据.

所有我能找到的都是这个问题,但即使是在那里做出的陈述似乎也是错误的:如果Map内部不使用线程安全的数据结构,那么它也不能被认为是线程安全的,如果我要去CreateMap在非并发上下文中调用,但同时使用Map.

即,例如ASP.NET MVC应用程序中AutoMapper唯一可能的使用模式是:

lock (mapperLock) {
    ... Mapper.AnyMethod(...) ...
}
Run Code Online (Sandbox Code Playgroud)

显然,如果我是对的,这是一个巨大的缺失.

所以我有两个问题:

  • 我对么?
  • 如果是,那么没有这个问题的AutoMapper的最佳替代方案是什么?

nem*_*esv 34

链接的问题或多或少地回答了您的问题:

Mapper.CreateMap不是线程安全的,也不会是线程安全的.但是,Mapper.Map是线程安全的.Mapper静态类只是MappingEngine和Configuration对象之上的一个瘦包装器.

因此,只有在以线程安全的方式Mapper.CreateMap一个中心位置进行配置时才使用.

你的评论是:

我问这个是因为我想在就地配置自动机,即在使用之前.我计划在非并发上下文中配置它,即~lock(mapperConfigLock){Mapper.CreateMap()....; 我担心现在这还不够.

如果您正在进行就地配置,请不要使用静态Mapper类.由于对github问题的评论建议直接使用映射引擎:

var config = 
    new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers());
config.CreateMap<Source, Destination>();
var engine = new MappingEngine(config);

var source = new Source();
var dest = engine.Map(source);
Run Code Online (Sandbox Code Playgroud)

这是一些更多的代码,但你可以围绕它创建自己的帮助器.但是在给定的方法中,一切都是本地的,因此没有共享状态不需要担心线程安全.

  • 这是提到的[github问题](https://github.com/AutoMapper/AutoMapper/issues/514)的链接。 (2认同)