簡體   English   中英

使用Automapper為成員創建地圖

[英]Creating maps for members using Automapper

我開始使用AutoMapper並有一個問題。 我遇到了這樣的示例代碼:

Automapper.Mapper.CreateMap<Book, BookViewModel>()
    .ForMember(dest => dest.Author,
               opts => opts.MapFrom(src => src.Author.Name));

因此,這將使我將一本書轉換為一本書模型,然后將src映射到src.author.name屬性,因為沒有1-1映射。

要確認,它不能單獨反向運行,這意味着我現在需要明確地做到這一點:

Mapper.Mapper.CreateMap<BookViewModel, Book>()
    .ForMember(dest => dest.Author.Name,
               opts => opts.MapFrom(src => src.Author));

那是對的嗎? 因此,為了進一步確認,如果我有50個視圖模型和視圖,則實際上需要100個(一個用於輸入,一個用於輸出,以及.ForMember表達式中的任何其他代碼行)

這是真的? 這是一種常見的做法嗎(即,您可能會看到數百行代碼來處理來回處理具有不匹配1-1的屬性的多個DTO的字段映射)?

CreateMap為AutoMapper創建一個映射,以便以后需要時使用。 在您的應用程序的生命周期內僅需要執行一次。 為了利用您已定義的映射,只需調用Automapper.Map方法。 因此,您不必一次又一次地創建映射。

例:

var myBookViewModel = Automapper.Map<Book, BookViewModel>(myBook);

您說的很對,為Book到BookViewModel定義一個映射器不會使Automapper為您自動為BookViewModel到Book創建一個映射器。 您必須創建映射器。

本質上 ,您基本上需要指定來回配置來處理每個DTO映射。 如果沒有確定性的模式,就不可能猜測成員名稱不同或所需的屬性在其他對象中更遠時(如您的示例),復雜對象之間的映射將如何工作。

但是 ,如果遵循一些基本模式,則Automapper相當聰明。 在您的情況下,如果將DTO屬性名稱更改為AuthorName而不是Author ,則CreateMap將正確映射,而無需手動指定映射(它們稱為“ Flattening”)。 如果它們遵循GetProperty() => Property { get; set; } Property { get; set; } Property { get; set; }模式 重命名DTO屬性以遵循此模式可能會節省很多行。 參閱他們的入門指南,以了解其他簡化映射的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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