2013-12-17 41 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