簡體   English   中英

如何將具有嵌套屬性的模型映射到平面Dto?

[英]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存在於DeviceAccessTokenDeviceDto它們將不需要映射。 由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM