简单的自动映射程序示例

本文关键字:映射程序 简单 | 更新日期: 2024-10-24 15:28:06

我很难理解如何映射某些对象。请回答一些关于这个简单例子的问题。

示例代码

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,因为Group中的List<User>由未映射的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-将GroupD更改为如下所示:

[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-仅此而已,因为自动映射器会自动将List<User>映射到List<UserDto>(因为它们有相同的名称,并且已经有从用户到用户的映射)

4-当你想绘制地图时,你可以拨打:

Mapper.Map<GroupDto>(groupEntity);

希望能有所帮助。

正如@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)))

这还没有经过测试,但想法就在这里。。。。