程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> AutoMapper搬運工之初探AutoMapper,automapper搬運工

AutoMapper搬運工之初探AutoMapper,automapper搬運工

編輯:C#入門知識

AutoMapper搬運工之初探AutoMapper,automapper搬運工


寫在前面

知道AutoMapper很久了,但是一直沒有用,最近剛好有個場景需要就用了,果然是利器。看了git上的wiki,發現內容其實wiki上寫的很全面了,深入的暫時還沒挖掘到。不過和群裡的朋友交流了下,覺得充當下搬運工,小小的翻譯下還是挺好的,小弟不才,希望看客大牛們輕拍磚。

什麼是AutoMapper?

 AutoMapper是一個完善的Mapping工具,所謂Mapping即數據對象轉換,借用群裡朋友的話是多用於領域對象和DTO對象的Mapping或者是SqlDataReader的Mapping。

 Git主頁:https://github.com/AutoMapper/AutoMapper

 Wiki主頁:https://github.com/AutoMapper/AutoMapper/wiki

簡單的例子

場景是這樣的在訂單業務裡,有Order、Customer、Product三個對象如下,其中Product被包含在OrderLinItem對象中:

1 public class Order 2 { 3   private readonly IList<OrderLineItem> _orderLineItems = new List<OrderLineItem>(); 4 5   public Customer Customer { get; set; } 6 7   public OrderLineItem[] GetOrderLineItems() 8   { 9     return _orderLineItems.ToArray(); 10   } 11 12   public void AddOrderLineItem(Product product, int quantity) 13   { 14     _orderLineItems.Add(new OrderLineItem(product, quantity)); 15   } 16 17   public decimal GetTotal() 18   { 19     return _orderLineItems.Sum(li => li.GetTotal()); 20   } 21 } 22 } 23 24 public class OrderLineItem 25 { 26   public OrderLineItem(Product product, int quantity) 27   { 28     Product = product; 29     Quantity = quantity; 30   } 31 32   public Product Product { get; private set; } 33   public int Quantity { get; private set;} 34 35   public decimal GetTotal() 36   { 37     return Quantity*Product.Price; 38   } 39 } 40 41 public class Customer 42 { 43   public string Name { get; set; } 44 } 45 46 public class Product 47 { 48   public decimal Price { get; set; } 49   public string Name { get; set; } 50 } View Code

  然後在頁面上我需要展示一些數據,為了保持頁面ViewModel的獨立,定義一個DTO(OrderDto)只包含了頁面需要的字段,如下:

public class OrderDto { public string CustomerName { get; set; } public decimal Total { get; set; } } View Code

然後問題來了,怎麼轉換呢?

我想最簡單的方法肯定是這樣子:

//定義一個order
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);

//轉換
var dto = new OrderDto();
dto.CustomerName = order.Customer.Name;
dto.Total = order.GetTotal();

上面的代碼看起來很簡單沒什麼問題,但是如果dto屬性有很多個呢?反復的手動Mapping會不會有點累?這時候攻城獅就得發揮偷懶精神,以下是使用了AutoMapper的代碼:

// 配置一個 AutoMapper 映射

Mapper.CreateMap<Order, OrderDto>();

// 執行 mapping
OrderDto dto = Mapper.Map<Order, OrderDto>(order);

是不是很簡單簡潔了,但是細心的會發現,這個Mapping稍微有點復雜,CustomerName對應的是order.Customer.Name;Total對應的是GetTotal方法。AutoMaper是如何做到,又是如何定義這個規則的呢?

AutoMapper的簡單默認Mapping規則

1. 針對復雜對象到簡單對象的映射,Mapping遵循駝峰命名的規則,即當目標dto屬性名稱在源對象中找不到時,AutoMapper會根據駝峰命名規則拆分dto屬性名(例如:CustomerName=>Customer.Name)去尋找相應的關系。

2. 針對是源對象中存在Get開頭的屬性(例如 Total => GetTotal),如果找不到同名屬性,則會匹配Get+PropertyName的方法。

 

本文搬運自AutoMapper Wiki之Flattening:https://github.com/AutoMapper/AutoMapper/wiki/Flattening

上面的規則是最簡單的匹配規則,對於復雜的Mapping,完全不符合上面的兩條特性的,那麼就需要進行Mapping的自定義配置,下節 《AutoMapper之自定義映射》裡,我會為大家搬運。有啥疑問和意見可以給我留言,咱們來探討一番,請大拿不吝賜教~!


automapper在ORM中的作用,教?

AutoMapper?舉個最簡單的例子。
比如在ORM中,與數據庫交互用的Model模型是具有很多屬性變量方法神馬的。而當我們與其它系統(或系統中的其它結構)進行數據交互時,出於耦合性考慮或者安全性考慮或者性能考慮(總之就是各種考慮),我們不希望直接將這個Model模型傳遞給它們,這時我們會創建一個貧血模型來保存數據並傳遞。神馬是貧血模型?貧血模型(DTO,Data Transfer Object)就是說只包含屬性神馬的,只能保存必須的數據,木有其它任何的多余的方法數據什麼的,專門用於數據傳遞用的類型對象。在這個創建的過程中,如果我們手動來進行,就會看到這樣的代碼:
B b=new B();
b.XXX1=a.XXX1;
b.XXX2=a.XXX2;
...
...
...
return b;

此時,AutoMapper可以發揮的作用就是根據A的模型和B的模型中的定義,自動將A模型映射為一個全新的B模型。從而避免寫這樣又臭又長又無聊的代碼。SO,理解為代碼生成器也可以……
 

誰可以幫我翻譯一下??

窗口
瓷磚瓷磚所有的Windows ,所以你可以看到他們所有
梯級的地方,所有的Windows再加上對方
安排安排最小的Windows在屏幕底部的
凍結分裂輸出窗口,以查看scrollback
刷新重繪當前窗口

明確抹掉屏幕(但保持scrollback )
空清除scrollback緩沖區和回收內存
命令緩沖區開放全面窗口命令編輯器
歷史顯示歷史命令
狀態顯示器的地位窗口
automapper顯示automapper窗口
幫助
內容顯示目錄
搜索聯機幫助數據庫
參考顯示命令參考
入門顯示入門幫助部分

指揮向導獲得幫助和例子zmud命令
函數向導獲得幫助和例子zmud職能
啟動屏幕顯示的初步歡迎對話框
發送反饋的反饋意見發送給作者的zmud
登記輸入您的注冊代碼為Shareware版本
關於版本,信貸,和版權信息
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved