如何将具有嵌套属性的模型映射到平面Dto?

时间:2014-10-10 14:21:21

标签: c# .net automapper dto convention-over-configur

我正在尝试创建从实体模型到Dto的映射,但每次尝试创建映射时我都失败了。

我有两个域类。这是我们模型的简化(Device例如有更多属性代表一堆不同的东西):

class Device
{
    public int Name {get; set;}
}

class DeviceAccessToken
{
    public Device Device {get; set;}
    public string Key {get; set;}
    public string Secret {get; set;}
}

然后,我想将DeviceAccessToken个实例映射到此DeviceDto(也简化了,原始Device模型中存在大多数字段):

class DeviceDto
{
    public int Name {get; set;}
    public string Key {get; set;}
    public string Secret {get; set;}
}

有没有办法创建此映射而不在映射中明确指定Device域模型的所有字段?

这实际上是我想要的,由AutoMapper配置文件表示:

class DeviceMappingProfile : Profile
{
    protected override void Configure()
    {
        this.CreateMap<DeviceAccessToken, DeviceDto>();

        this.CreateMap<Device, DeviceDto>()
            .ForMember(dest => dest.Key, opt => opt.Ignore())
            .ForMember(dest => dest.Secret, opt => opt.Ignore());
    }
}

.ForAllMembers电话试图使这项工作失败,它必须不像我设想的那样运作。

我知道我可以通过在Device映射中指定DeviceAccessToken->DeviceDto的每个属性来做到这一点,但这将是一场噩梦并且非常多余,因为名称是相同的。

1 个答案:

答案 0 :(得分:1)

&#34;有没有办法创建此映射而不在映射中明确指定Device域模型的所有字段?&#34;

是的,您可以在Dto对象中使用命名约定,这样可以防止您必须在创建映射中输入它们。

举个例子:

您的值密钥和密钥存在于DeviceAccessTokenDeviceDto中,它们不需要映射。 由于Device是嵌套对象,因此您的dto可以使用DeviceName的约定。

示例:

using System;
using AutoMapper;

class Device
{
    public string Name {get; set;}
}

class DeviceAccessToken
{
    public Device Device {get; set;}
    public string Key {get; set;}
    public string Secret {get; set;}
}

class DeviceDto
{
    public string DeviceName {get; set;}
    public string Key {get; set;}
    public string Secret {get; set;}
}

public class Program
{
    public void Main()
    {

        // Configure AutoMapper
        Mapper.CreateMap<DeviceAccessToken, DeviceDto>();       

        var dat = new DeviceAccessToken { Device = new Device { Name = "Dev Name" }, Key = "Key", Secret = "Secret" };

        var dto = Mapper.Map<DeviceDto>(dat);

        Console.WriteLine(dto.DeviceName);
        Console.WriteLine(dto.Key);
        Console.WriteLine(dto.Secret);
    }
}

<强> Working fiddle