[英]AutoMapper: Avoid infinite recursion with MaxDepth?
我有以下简单的代码
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);
}
但我不能阻止无限递归,因为它保留了对象引用。
如何仅限于第一个“已映射”实例?
例子:
UserDto -> 列表 -> UserGrop -> 列表(空)
UserDto -> 列表 -> UserDto (null)
提前致谢。
好的,这似乎是一个糟糕的模式实现。
我通过采用以下映射找到了解决问题的方法。
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.