c# - AutoMapper 如何根据上下文以不同方式将对象 A 映射到对象 B

标签 c# automapper

召集所有 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/

相关文章:

c# - 字符串格式不对

c# - 忽略使用 Automapper 映射一个属性

c# - 关于 As<>() 方法在 AutoMapper 中的作用的详细信息

c# - LISP 开发人员将如何解决 AutoMapper 在 .NET 中解决的问题?

c# - 在 iTextSharp 中设置表格高度

c# - ASP.NET 线程 : should I use the pool for DB and Emails actions?

c# - 如何在automapper中映射内部类

c# - 方法返回非空值后抛出空引用异常

c# - 创建仅由局部变量引用的 BackgroundWorker 对象是否定义明确?

c# - 如何在 AOT 平台上在运行时生成任何泛型类型?