我正在尝试创建从实体模型到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
的每个属性来做到这一点,但这将是一场噩梦并且非常多余,因为名称是相同的。
答案 0 :(得分:1)
&#34;有没有办法创建此映射而不在映射中明确指定Device域模型的所有字段?&#34;
是的,您可以在Dto对象中使用命名约定,这样可以防止您必须在创建映射中输入它们。
举个例子:
您的值密钥和密钥存在于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);
}
}
<强> Working fiddle 强>