簡體   English   中英

使用自動映射器從兩個項目進行映射

[英]Mapping from two items with automapper

在我的數據層中,我有一個存儲庫,可以返回如下所示的項目列表:

new List<Item> {
    new Item { Title = "Something", DetailId = 500 },
    new Item { Title = "Whatever", DetailId = 501 },
}

存儲庫還有另一種方法,當給定項目的詳細信息ID時,可以返回這些項目的詳細信息:

// repository.GetDetail(500) would return something like:
new ItemDetail {
    Id = 500,
    Size = "Large"        
}

現在,在我的服務層中,我想將上面的列表映射成這樣的東西:

new List<ServiceItem> {
    new ServiceItem { Title = "Something", Size = "Large" },
    new ServiceItem { Title = "Whatever", Size = "Medium" },
}

請注意,我需要列表中的對象(在本例中為Title )和詳細對象的屬性。 有什么好的方法可以使用AutoMapper進行映射嗎?

我曾考慮過要制作一個依賴於我的存儲庫實例的配置文件,然后讓AutoMapper進行詳細請求,但是讓AutoMapper提取新數據有點混亂嗎?

有沒有一種干凈的方法可以將兩個對象映射為一個?

一種可能性是將您的Item和ItemDetail對象包裝在一個Tuple中,然后根據該Tuple定義Map。 映射代碼如下所示。

Mapper.CreateMap<Tuple<Item, ItemDetail>, ServiceItem>()
    .ForMember(d => d.Title, opt => opt.MapFrom(s => s.Item1.Title))
    .ForMember(d => d.Size, opt => opt.MapFrom(s => s.Item2.Size));

您必須自己加入正確的Item和ItemDetail。 如果希望Automapper也將Item與正確的ItemDetail進行匹配,則需要更改映射,以便在Size解析期間,Automapper執行查找並返回匹配的Size。 代碼看起來像這樣。

Mapper.CreateMap<Item, ServiceItem>()
    .ForMember(d => d.Size, opt => opt.MapFrom(s => itemDetails.Where(x => s.DetailId == x.Id).First().Size));

該映射使用Automapper的自動映射功能將Item.Title映射到ServiceItem.Title。 該映射使用一個名為itemDetails的IEnumerable來查找匹配項,但是應該可以用數據庫調用替換它。 現在,由於我不認為Autmapper設計要進行這種類型的查找,因此對於大量項目而言性能可能不那么好。 那將是要測試的東西。

該博客描述了執行此操作的方法: http : //consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx 它對每個輸入對象進行一次Map()調用,但至少將其包裝在一個輔助對象中。

使用ValueInjecter代替AutoMapper,它很容易在兩者之間切換,並且ValueInjecter支持從多個源中直接插入值。

serviceItem.InjectFrom(item);
serviceItem.InjectFrom(itemDetail);

另外,您不必像使用AutoMapper一樣執行所有靜態映射

暫無
暫無

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

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