如何让 AutoMapper 不缓存映射对象?

2024-01-15

当 AutoMapper 遇到一个已经映射的对象时,它似乎会再次使用该对象,而不是尝试重新映射它。我相信它这样做是基于.Equals().

我有一棵正在绘制地图的树。因此,一个具有一些属性和子节点的节点。多个节点具有相同的值.Equals(),因为它基于 Id 属性。节点的子节点不同,我需要重新映射它们,但它使用缓存的映射值。

有没有办法关闭缓存映射?我能想到的就是实现一个新的转换器,但这完全违背了使用 AutoMapper 的目的。

这是有关如何重现的示例。

void Main()
{
    var source = new List<Tag>
    {
        new Tag 
        { 
            Id = 1, 
            Name = "Tag 1", 
            ChildTags = new List<Tag>
            {
                new Tag 
                { 
                    Id = 2, 
                    Name = "Tag 2", 
                    ChildTags = new List<Tag> 
                    {
                        new Tag {Id = 3, Name = "Tag 3"},
                        new Tag {Id = 4, Name = "Tag 4"}
                    }
                }
            }
        },
        new Tag { Id = 1, Name = "Tag 1" },
        new Tag 
        {
            Id = 3, Name = "Tag 3", ChildTags = new List<Tag>
            {
                new Tag {Id = 4, Name = "Tag 4"}
            }
        }
    };

    Mapper.CreateMap<Tag, Tag>();
    var results = Mapper.Map<IList<Tag>, IList<Tag>>(source);

    results.Dump();
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Tag> ChildTags { get; set; }

    public override bool Equals(Object obj)
    {
        if (obj == null)
        {
            return false;
        }

        var x = this;
        var y = (Tag)obj;

        return x.Id.Equals(y.Id);
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

现在有一个选项可以禁用缓存。

Mapper.CreateMap<Tag, Tag>();
var results = Mapper.Map<IList<Tag>, IList<Tag>>(source, opt => opt.DisableCache = true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 AutoMapper 不缓存映射对象? 的相关文章

随机推荐