[英]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.