2013-12-17 40 views
17

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

实施例代码

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>(); 

当映射GroupGroupDto,你必须映射UserUserDto内部因为在GroupList<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))) 

这是正确的吗?

+4

为什么你的GroupDTO不包含UserDTO?如果是这样,那么AutoMapper就不需要更多的配置,除了'CreateMap'。 – stuartd

+0

这里是简单的文章,我写在使用C#的Automapper上http://www.codeproject.com/Articles/986460/What-is-Automapper –

+0

阅读此文章:http://www.codearsenal.net/2012/12/ csharp-object-to-object-mapping-automapper.html –

回答

4

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

否则,陈GE

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))) 

这还没有测试,但这个想法是在这里....

17

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

4-当你想你映射电话:

Mapper.Map<GroupDto>(groupEntity); 

希望有所帮助。

+0

“因为它们具有相同的名称”, - 键入重要吗?如果一个对象是列表,另一个是ICollection,它是否需要成员映射? – batmaci

+0

我想查看AutoMapper 5的更新示例。我认为大部分内容不再有效。 – jocull