召集所有 AutoMapper 专家!
我希望能够根据运行时的上下文以不同方式将对象 A 映射到对象 B。特别是,我想在一种映射情况下忽略某些属性,而在另一种情况下映射所有属性。
我遇到的是 Mapper.CreateMap 可以在不同的映射情况下成功调用,但是,一旦调用 CreateMap,就会设置特定类型对的映射,并且随后不会通过成功的 CreateMap 调用进行更改,这可能以不同方式描述映射。
我发现一篇博文提倡 Mapper.Reset() 来解决这个问题,但是,Mapper 类的静态性质意味着碰撞和崩溃发生只是时间问题。
有办法吗?
我认为我需要为每个应用程序域调用一次 Mapper.CreateMap,然后能够调用 Mapper.Map 并提示应包含/排除哪些属性。
现在,我正在考虑通过编写一个基于映射配置实例的非静态映射类来更改源代码。性能差,但线程安全。
我有什么选择。可以做什么? Automapper 看起来很有前途。
最佳答案
只是为了补充 Jimmy 的回答,这里是在没有静态 Mapper 的情况下使用 AutoMapper 所需的代码
从版本 4.2.1 开始Automapper 具有经过批准的非静态映射器和配置(感谢 Jimmy!)。
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<ClassA, ClassB>();
});
var mapper = config.CreateMapper();
新版本中还有许多其他有用的选项(例如配置文件)用于创建不同的映射器实例。 您可以在 official documentation 中获取所有详细信息
(适用于 4.1.1 版)
// Configuration
AutoMapper.Mappers.MapperRegistry.Reset();
var autoMapperCfg = new AutoMapper.ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers);
var mappingEngine = new AutoMapper.MappingEngine(autoMapperCfg);
autoMapperCfg.Seal();
//Usage example
autoMapperCfg.CreateMap<ClassA, ClassB>();
var b = mappingEngine.Map<ClassB>(a);
(适用于版本 3.2.1)
// Configuration
var platformSpecificRegistry = AutoMapper.Internal.PlatformAdapter.Resolve<IPlatformSpecificMapperRegistry>();
platformSpecificRegistry.Initialize();
var autoMapperCfg = new AutoMapper.ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers);
var mappingEngine = new AutoMapper.MappingEngine(autoMapperCfg);
//Usage example
autoMapperCfg.CreateMap<ClassA, ClassB>();
var b = mappingEngine.Map<ClassB>(a);
(适用于版本 2.2.1)
// Configuration
var autoMapperCfg = new AutoMapper.ConfigurationStore(new AutoMapper.TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.AllMappers());
var mappingEngine = new AutoMapper.MappingEngine(autoMapperCfg);
//Usage example
autoMapperCfg.CreateMap<ClassA, ClassB>();
var b = mappingEngine.Map<ClassB>(a);
关于c# - AutoMapper 如何根据上下文以不同方式将对象 A 映射到对象 B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2734108/