1

我正在尝试创建从我们的实体模型到 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,但这将是一场噩梦并且非常多余,因为名称是相同的。

4

1 回答 1

1

“有没有一种方法可以在不明确指定映射中设备域模型的所有字段的情况下创建此映射?”

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

举个例子:

您的值 Key 和 Secret 存在于DeviceAccessToken其中,DeviceDto不需要映射它们。作为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);
    }
}

工作小提琴

于 2014-10-10T16:10:16.513 回答