02.AutoMapper 之扁平化(Flattening)
扁平化(Flattening)
物件對映器的常見用法是將一個複雜物件模型扁平化為一個簡單模型。例如您有一個以下複雜模型:
public class Order
{
private readonly IList<OrderLineItem> _orderLineItems = new List<OrderLineItem>();
public Customer Customer { get; set; }
public OrderLineItem[] GetOrderLineItems()
{
return _orderLineItems.ToArray();
}
public void AddOrderLineItem(Product product, int quantity)
{
_orderLineItems.Add(new OrderLineItem(product, quantity));
}
public decimal GetTotal()
{
return _orderLineItems.Sum(li => li.GetTotal());
}
}
public class Product
{
public decimal Price { get; set; }
public string Name { get; set; }
}
public class OrderLineItem
{
public OrderLineItem(Product product, int quantity)
{
Product = product;
Quantity = quantity;
}
public Product Product { get; private set; }
public int Quantity { get; private set;}
public decimal GetTotal()
{
return Quantity*Product.Price;
}
}
public class Customer
{
public string Name { get; set; }
}
我們希望將這個複雜的Order
物件扁平化為一個更簡單的OrderDto
,它只包含特定場景所需的資料:
public class OrderDto
{
public string CustomerName { get; set; }
public decimal Total { get; set; }
}
當您在AutoMapper
中配置源/目標型別對時,配置程式會嘗試將源型別上的屬性和方法與目標型別上的屬性進行匹配。如果對於目標型別上任何屬性,在源型別上沒有匹配的屬性、方法或者Get字首的方法,AutoMapper
根據PascalCase
約定將目標成員名稱拆分為單個單詞。
// 複雜模型
var customer = new Customer
{
Name = "George Costanza"
};
var order = new Order
{
Customer = customer
};
var bosco = new Product
{
Name = "Bosco",
Price = 4.99m
};
order.AddOrderLineItem(bosco, 15);
// 配置 AutoMapper
Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
// 執行對映
OrderDto dto = Mapper.Map<Order, OrderDto>(order);
dto.CustomerName.ShouldEqual("George Costanza");
dto.Total.ShouldEqual(74.85m);
在AutoMapper
中使用CreateMap
方法配置型別對映。AutoMapper
只能對映它識別的型別對,所以我們用CreateMap
顯式註冊了源/目標型別對。使用Map
方法執行對映。
在OrderDto
型別上,Total
屬性與 Order
型別的GetTotal()
方法匹配。CustomerName
屬性與Order
型別的Customer.Name
匹配。只要目標屬性命名符合規定,就不需要在單獨配置屬性匹配規則。
相關文章
- JavaScript 專題之陣列扁平化JavaScript陣列
- js物件的扁平化與反扁平化JS物件
- web前端陣列處理之扁平化陣列Web前端陣列
- 陣列扁平化陣列
- JS 扁平化 (flatten) 陣列JS陣列
- 多維陣列扁平化陣列
- 扁平化設計原則
- 20個優秀手機介面扁平化設計,讓你一秒看懂扁平化
- 【知識分享】扁平化與分層化
- js陣列去重、扁平化函式JS陣列函式
- 陣列去重和陣列扁平化陣列
- 5種方式實現陣列扁平化陣列
- reduce實現filter,map 陣列扁平化等Filter陣列
- JS陣列專題1️⃣ ➖ 陣列扁平化JS陣列
- UI設計培訓中的扁平化理念UI
- Carbon Equal Dao——扁平化治理結構簡介
- 扁平化圖示的終極設計指南
- 網站設計扁平化站有哪些優勢?網站
- MongoDB 聚合嵌入的陣列(扁平化資料+管道)MongoDB陣列
- [譯] 扁平化的 UI 元素既樸實又玄乎UI
- 扁平化設計的8個實用小技巧
- 用扁平化的介面設計吸引使用者
- 綠色扁平化小清新網站 框架:TP3.13網站框架
- 面試官:JavaScript如何實現陣列拍平(扁平化)方法?面試JavaScript陣列
- Flat UI:基於 Bootstrap 的扁平化 UI 開發包UIboot
- Java中將多個Map扁平化為單個MapJava
- Cydia介面風格視覺更新 更扁平化更現代化視覺
- 一加手機氫OS系統介面曝光:扁平化風格
- 陳育新:微商問題多 但扁平化平臺不是出路
- .NET 開源扁平化、美觀的 C/S 控制元件庫控制元件
- JavaScript陣列常用方法解析和深層次js陣列扁平化JavaScript陣列JS
- 分享!20套驚豔的扁平化設計素材免費下載
- 25個細緻微妙的扁平化2.0風格網頁設計網頁
- OS X 10.10也會扁平化,但幅度沒有iOS 7大iOS
- 向設計師分享30個免費的扁平化風格設計素材
- 韓國版“微信”Kakao靠全員加持創業感實現扁平化創業
- 流行趨勢:純色在扁平化網頁設計中的20個應用網頁
- 最近遇到的問題總結(陣列去重、扁平化處理、sort 以及Promise等等)陣列Promise