2014-10-10 61 views
1

我想創建一個從我們的實體模型到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的每個屬性來做到這一點,但這將是一場噩夢,並且非常冗餘,因爲名稱相同。

回答

1

「有沒有一種方法可以創建此映射,而不必在映射中明確指定設備域模型的所有字段?」

是的,你可以在你的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); 
    } 
} 

Working fiddle

+0

小後我張貼我發現的問題[本文](https://github.com/AutoMapper/AutoMapper/wiki/Flattening )解釋了你所談論的這個約定,現在我決定使用它。但是有沒有辦法通過約定讓automapper識別屬性,而不必在嵌套屬性名稱前加前綴?就我而言,我必須創建兩個非常相似的Dtos,因爲其中一個需要有這個約定,而另一個則不需要。在某些地方,我需要將一個'Device'直接映射到'DeviceDto',這會使我的很多事情變得更簡單。 – julealgon 2014-10-10 20:15:24

+1

@julealgon嗨,我知道你的意思,但它似乎不同於原來的問題。我會創建一個新問題,你會得到更多的人試圖回答它。我之前使用過INamingConvention更改慣例,這可能是您可以使用的。 https://github.com/AutoMapper/AutoMapper/blob/d6eaf7025932ebedccbf8c339a155e9f4ae5c5d8/src/AutoMapper/INamingConvention.cs – hutchonoid 2014-10-14 11:19:43

相關問題