将 MaxDepth 设置为 1 时,Automapper 10 不会映射集合属性

Automapper 10 wouldn't map collection properties when setting MaxDepth to 1

从 Automapper 9 迁移到 10 时,ICollection 类型的属性未映射。我使用的是 .NET 5。

我有以下设置:

private class Class1
{
    public int Id { get; set; }
}

private class Class2
{
     public int Id { get; set; }
     public ICollection<Class1> ChildClasses { get; set; }
}

private class Class2Bis
{
     public int Id { get; set; }
     public ICollection<Class1> ChildClasses { get; set; }
}

private class MapperProfile : Profile
{
     public MapperProfile()
     {
          CreateMap<Class2, Class2Bis>().ReverseMap();
     }
}

我正在使用使用 AutoMapper.Extensions.Microsoft.DependencyInjection 模块的辅助方法注入映射器:

public static IServiceCollection AddMapper(this IServiceCollection services, params Assembly[] assemblies)
{
    return services.AddAutoMapper(cfg =>
    {
        cfg.ForAllMaps((map, exp) => exp.MaxDepth(1));
        cfg.AllowNullCollections = true;
        cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
    },
    assemblies);
}

以下测试使用 Automapper 9 成功但使用 Automapper 10 失败:

    [Fact]
    public void Should_Map_ClassesWithCollectionProperties()
    {
        var object2 = new Class2
        {
            Id = 1,
            ChildClasses = new List<Class1>() 
            {
                new Class1 
                {
                    Id = 1
                }
            }
        };

        var object2Bis = _mapper.Map<Class2Bis>(object2);

        Assert.Equal(object2.ChildClasses.Count, object2Bis.ChildClasses.Count);
    }

object2Bis 在使用 Automapper 10 时有一个空的 ChildClasses 属性。

删除 cfg.ForAllMaps((map, exp) => exp.MaxDepth(1)); 或将 MaxDepth 设置为 2(或更大的数字)使代码对我有用。 10.0 Upgrade Guide 中有下一个注释:

When reaching MaxDepth, destination collections are null/empty, they used to contain null values.