繁体   English   中英

使 AutoMapper 重用以前映射的实例

[英]Making AutoMapper reuse previously mapped instances

我希望 AutoMapper 将相同的对象实例Source映射到相同的Target实例。

我确定 AutoMapper 可以配置为执行此操作,但是如何配置? 我需要将对象图 A 转换为 B,保持映射对象之间的引用。

例如,这失败了:

[Fact]
public void Same_instances_are_mapped_to_same_instances()
{
    var configuration = new MapperConfiguration(config => config.CreateMap<Source, Target>());
    var mapper = configuration.CreateMapper();

    var source = new Source();
    var list = mapper.Map<IEnumerable<Target>>(new[] { source, source, source });

    list.Distinct().Should().HaveCount(1);
}

public class Source
{
}

public class Target
{   
}

它想让这个测试通过。

另外,请注意映射器应该“记住”在当前Map调用期间映射的实例。

这是你能得到的最近的:

public static class Program
{
    public static void Main()
    {
        var config = new MapperConfiguration(conf => conf.CreateMap<Source, Target>().PreserveReferences());
        var mapper = config.CreateMapper();

        var source = new Source();
        var list = new[] { source, source, source };
        var firstRun = mapper.Map<IEnumerable<Target>>(list);
        var secondRun = mapper.Map<IEnumerable<Target>>(list);

        // Returns two items
        var diffs = firstRun.Concat(secondRun).Distinct();

        foreach (var item in diffs)
        {
            Console.WriteLine(item.Id);
        }
    }
}

public class Source
{
    public Guid Id { get; } = Guid.NewGuid();
}

public class Target
{
    public string Id { get; set; }
}

这意味着,在每次调用mapper.Map()情况下,您只会得到相同的项目,但是如果您多次调用映射器,您将为每次调用取回新项目(这是有道理的,否则映射器必须在整个生命周期内保存对所有给定和创建的实例的引用,这可能会导致一些严重的内存问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM