[英]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.