【问题标题】:Deep cloning via Automapper ignoring specific property from the hierarchy通过 Automapper 进行深度克隆,忽略层次结构中的特定属性
【发布时间】: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


【解决方案1】:

我不会为这个人使用 Automapper,请尝试 AnyClone 来执行此操作。它会进行深度克隆,并且可以通过似乎是您正在寻找的属性名称来忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    相关资源
    最近更新 更多