[英]How do I map a model with nested properties to a flat Dto?
我正在尝试创建从我们的实体模型到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
每个属性来做到这一点,但这将是一场噩梦,而且由于名称相同,因此非常多余。
“有没有一种方法可以创建此映射而无需在映射中显式指定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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.