【发布时间】:2018-11-24 07:12:30
【问题描述】:
我有一个关于 Automapper 映射定义的相当简单的问题。我的意图是通过 Automapper 深度克隆一个对象,同时忽略“Id”属性,这就是我选择它来自定义映射的原因。
public interface IEntity<T>
{
T Id { get; }
}
public abstract class Entity : IEntity<Guid>
{
public Guid Id { get; set; }
}
我所有的实体都派生自 Entity 类,我只是想忽略我的对象嵌套层次结构中的所有 Id 属性,而不是对映射定义如此明确。
到目前为止,我已经想出了以下代码来进行克隆,但如何忽略嵌套属性的 Id 属性映射,而不仅仅是根。
public static T AutomapperClone<T>(this T source)
where T : IEntity<Guid>
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<T, T>()
.ForMember(d => d.Id, o => o.Ignore());
});
// checking configuration validity
config.AssertConfigurationIsValid();
// creating mapper
var mapper = config.CreateMapper();
var copy = mapper.Map<T, T>(source);
return copy;
}
这个想法是所有实体都获得新的 ID,而不是使用相同的映射 ID。它可以通过 Automapper 完成吗?
感谢您的反馈。
【问题讨论】:
-
AM 主要是一个缓存,该缓存位于 MapperConfiguration 中。您的应用程序应该只有一个这样的对象。因此,除非您愿意花一些时间了解 AM 的工作原理,否则最好手动绘制地图。
-
感谢您的评论,是的,我对 AM 有基本的了解,但问题是很少有动态模块按需加载并扩展模型,因此我无法定义一次性 MapperConfiguration 完全包含的扩展模型。因此,如果我的源模型和目标模型相同,我正在尝试寻求有关 AM 的帮助。它是一个有效的用例,我问这个问题是否可以通过 AM 完成
-
不,模块不应该使用 MappingConfiguration,它们应该定义要由应用程序定义的 MappingConfiguration 单例加载的配置文件。因此,在尝试使映射工作之前,您应该修复使用 AM 的方式。当你的房子着火时,你不要试图修理水龙头。
标签: c# automapper deep-copy automapper-8