web-dev-qa-db-ja.com

シンプルなオートマッパーの例

特定のオブジェクトをマップする方法を理解するのに苦労しています。この簡単な例に関するいくつかの質問に答えてください。

サンプルコード

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にマッピングする場合、UserList<User>はマップされていないUserDtoで構成されているため、GroupUsersに内部でマッピングする必要がありますか?もしそうなら、どうやってこれをしますか?私の推測は

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

これは正しいです?

32
David

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

お役に立てば幸いです。

29
Omar.Alani

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

これはテストされていませんが、アイデアはここにあります。

5
Minus