使用自动映射器将第二级嵌套列表属性映射到第一级列表属性

时间:2018-12-15 09:34:05

标签: c# asp.net-core automapper asp.net-core-2.1 automapper-5

我需要你的帮助。我对自动映射器有基本的经验,并且一切都很好,但是以某种方式,我无法将源对象中的下一个更改映射到目标对象。

让我解释一下:
在IUser中,我添加了一个属性“ UserDetails”,此类包含一个名为“ Domains”的Guid属性列表。

我想将该第二级列表属性映射到我的UserDto对象,其中guid属性的列表位于第一级。在下面的示例中,Userkey映射工作正常,但是我对'DomainIds'始终保持null,并且看不到我在做错什么。希望您能帮助我

public interface IUser
{
    UserKey Key { get; }
    UserDetails Details { get; set; }
    FirstName { get; }
}

public struct UserKey
{
    private readonly Guid _id;
    public UserKey(Guid id)
    {
        _id = id;
    }
}

public class UserDetails
{
    public List<Guid> Domains { get; set; }
}

public class UserDto
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public List<Guid> DomainIds { get; set; }
}

映射设置如下:

CreateMap<IUser, UserDto>()
            .ForMember(
                dest => dest.Id,
                opt => opt.MapFrom(src => src.Key.Id))
            .ForMember(
                dest => dest.DomainIds,
                opt => opt.MapFrom(src => src.Details.Domains))

在我的测试中,我映射了这样的用户(即IUser)。方便,所有其他属性都可以很好地映射

_mapper.Map<UserDto>(user);

1 个答案:

答案 0 :(得分:0)

您的映射对我来说似乎很好:

Mapper.Initialize(config =>
{
    config.CreateMap<User, UserDto>()
        .ForMember(
            dest => dest.Id,
            opt => opt.MapFrom(src => src.Key.Id))
        .ForMember(
            dest => dest.DomainIds,
            opt => opt.MapFrom(src => src.Details.Domains));
});

var user = new User
{
    FirstName = "foo",
    Key = new UserKey { Id = Guid.NewGuid() },
    Details = new UserDetails
    {
        Domains = new List<Guid> { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() },
    },
};

var result = Mapper.Map<UserDto>(user);

使用以下类型:

public class User
{
    public UserKey Key { get; set; }
    public UserDetails Details { get; set; }
    public string FirstName { get; set; }
}
public class UserKey
{
    public Guid Id {get;set;}
}
public class UserDetails
{
    public List<Guid> Domains { get; set; }
}

public class UserDto
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public List<Guid> DomainIds { get; set; }
}