我试图创建一个从实体模型到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
调用是一次失败的尝试,它不能像我想象的那样工作
我知道我可以通过在DeviceAccessToken->DeviceDto
映射中指定Device
的每个属性来实现这一点,但这将是一场噩梦,而且非常多余,因为名称是相同的。
"有没有一种方法可以在不显式指定映射中设备域模型的所有字段的情况下创建此映射?"
是的,您可以在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);
}
}
工作小提琴