简体   繁体   English

AutoMapper:避免使用 MaxDepth 进行无限递归?

[英]AutoMapper: Avoid infinite recursion with MaxDepth?

I've the following simple code我有以下简单的代码

    public class User
    {
        public List<UserGroup> UserGroups { get; set; }
        public string Name { get; set; }
    }

    public class UserGroup
    {
        public User User { get; set; }
        public Group Group { get; set; }
    }

    public class Group
    {
        public List<UserGroup> UserGroups { get; set; }
        public string Name { get; set; }
    }

    public class UserDto
    {
        public List<UserGroupDto> UserGroups { get; set; }
        public string Name { get; set; }
    }

    public class UserGroupDto
    {
        public UserDto User { get; set; }
        public GroupDto Group { get; set; }
    }

    public class GroupDto
    {
        public List<UserGroupDto> UserGroups { get; set; }
        public string Name { get; set; }
    }

    private static void TestAutoMapper()
    {
        var mapperCfg = new AutoMapper.MapperConfiguration(cfg =>
        {
            cfg.CreateMap<User, UserDto>().MaxDepth(1);
            cfg.CreateMap<UserGroup, UserGroupDto>().MaxDepth(1);
            cfg.CreateMap<Group, GroupDto>().MaxDepth(1);
        });
        var mapper = mapperCfg.CreateMapper();

        var user = new User { Name = "User1" };
        var group = new Group { Name = "Group1" };
        var userGroups = new List<UserGroup> { new UserGroup { User = user, Group = group } };
        user.UserGroups = userGroups;
        group.UserGroups = userGroups;

        var users = new List<User> { user };
        var usersDto = mapper.Map<IEnumerable<User>, IEnumerable<UserDto>>(users);
    }

But I can't prevent infinite recursion because it preserve the objects reference.但我不能阻止无限递归,因为它保留了对象引用。

How can I limit to only the first "already mapped" instance?如何仅限于第一个“已映射”实例?

example:例子:

UserDto -> List -> UserGrop -> List (null) UserDto -> 列表 -> UserGrop -> 列表(空)

UserDto -> List -> UserDto (null) UserDto -> 列表 -> UserDto (null)

Thanks in advance.提前致谢。

Ok, it seems to be a bad pattern implementation.好的,这似乎是一个糟糕的模式实现。

I found a solution to my problem by adopting the following mappings.我通过采用以下映射找到了解决问题的方法。

    private static void TestAutoMapper()
    {
        var mapperCfg = new AutoMapper.MapperConfiguration(cfg =>
        {
            cfg.CreateMap<User, UserDto>()
                .ForMember(dst => dst.UserGroups, opt => opt.Ignore())
            ;
            cfg.CreateMap<UserGroup, UserGroupDto>();
            cfg.CreateMap<Group, GroupDto>()
                .ForMember(dst => dst.UserGroups, opt => opt.Ignore())
            ;
        });
        var mapper = mapperCfg.CreateMapper();

        var user = new User { Name = "User1" };
        var group = new Group { Name = "Group1" };
        var userGroups = new List<UserGroup> { new UserGroup { User = user, Group = group } };
        user.UserGroups = userGroups;
        group.UserGroups = userGroups;

        var users = new List<User> { user };

        var usersDto = users.Select(u =>
        {
            var dto = mapper.Map<User, UserDto>(u);
            dto.UserGroups = mapper.Map<IEnumerable<UserGroup>, IEnumerable<UserGroupDto>>(u.UserGroups).ToList();

            return dto;
        });
    }

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

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