2017-07-14 70 views
1

我使用AutoMapper(V6.1.1)來映射某個實體對象將由一個網絡API REST Web服務在.NET 4.6返回DTO的對象。 2基於屬性名稱C#AutoMapper自定義解析

現在我手動設置我的映射是這樣的:

Mapper.Initialize((config) => 
{ 
    config.CreateMap<SignBook, sdk.SignBook>() 
     .ForMember(dto => dto.DocumentId, conf => conf.MapFrom(obj => obj.Document.Id)) 
     .ForMember(dto => dto.UserId, conf => conf.MapFrom(obj => obj.User.Id)) 
     .ForMember(dto => dto.DeviceId, conf => conf.MapFrom(obj => obj.Device.Id)) 
     .ForMember(dto => dto.SignTypeId, conf => conf.MapFrom(obj => obj.SignType.Id)) 
     .ForMember(dto => dto.StateId, conf => conf.MapFrom(obj => obj.State.Id)) 
     .ReverseMap(); 
}); 

但是,正如你所看到的,DTO對象的所有屬性被簡單地命名爲像實體名稱+「ID」後綴(如:實體中的Document.Id到DTO中的DocumentId)。

由於我有很多實體映射,我想創建AutoMapper的映射規則(所以創建一個自定義解析器),將自動執行此操作。 它可能以某種方式?

當你需要這樣做時,是否還有一些最佳實踐?所以我想要做的是將實體對象映射到DTO對象。我的實體是NHibernate對象,它們之間有很多的實現,並且也使用了Lazy Loading,所以我不能直接將它們推回Web API方法結果以進行序列化。

回答

1

AutoMapper默認支持Flattening。所有你需要的是簡單的映射:

Mapper.Initialize(config => 
{ 
    config.CreateMap<SignBook, sdk.SignBook>().ReverseMap(); 
}); 

和AutoMapper 6.1 Unflattening開始也支持。


壓扁:

var entity = new SignBook { new Document { Id = 42 } }; 
var dto = Mapper.Map<sdk.SignBook>(entity); 

給你

{ 
    "DocumentId": 42 
} 

Unflattening:

var dto = new sdk.SignBook { DocumentId = 42 }; 
var entity = Mapper.Map<SignBook>(dto); 

{ 
    "Document": { 
    "Id": 42 
    } 
} 
+1

我真的不知道它是如此簡單! –