Простой пример автоперевозок
Мне сложно понять, как сопоставить определенные объекты. Ответьте на некоторые вопросы об этом простом примере.
Пример кода
class User
{
private int id;
private string name;
}
class Group
{
private int id;
private string name;
private List<User> users;
}
[DataContract]
public class UserDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
}
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<User> Users { get; set; }
}
Мапперы
Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>();
Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>();
При отображении Group
в GroupDto
вам нужно отобразить User
в UserDto
внутренне, потому что List<User>
in Group
состоит из unmapped Users
? Если да, то как вы это делаете? Моя догадка
Mapper.CreateMap<Group, GroupDto>()
.ForMember(g => g.id, opt => opt.Ignore());
.ForMember(g => g.name, opt => opt.Ignore());
.ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))
Правильно ли это?
Ответы
Ответ 1
1- Измените GroupDto таким образом:
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<UserDTO> Users { get; set; }
}
2- Создайте свои сопоставления:
Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>(); // Only if you convert back from dto to entity
Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>(); // Only if you convert back from dto to entity
3 - все, потому что auto mapper автоматически отобразит List<User>
в List<UserDto>
(поскольку у них есть одно и то же имя, и уже есть сопоставление пользователя с UserDto)
4- Когда вы хотите нанести на карту свой вызов:
Mapper.Map<GroupDto>(groupEntity);
Надеюсь, что это поможет.
Ответ 2
Как сказал @stuartd, если вы измените:
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<User> Users { get; set; }
}
для:
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<UserDTO> Users { get; set; }
}
вам просто нужно:
Mapper.CreateMap()
В противном случае измените
Mapper.CreateMap<Group, GroupDto>()
.ForMember(g => g.id, opt => opt.Ignore());
.ForMember(g => g.name, opt => opt.Ignore());
.ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))
для чего-то вроде:
Mapper.CreateMap<Group, GroupDto>()
.ForMember(g => g.id, opt => opt.Ignore());
.ForMember(g => g.name, opt => opt.Ignore());
.ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<List<User>>(g.Users)))
Это не было проверено, но идея здесь.