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

AutoMapper(五),automapper

編輯:C#入門知識

AutoMapper(五),automapper


返回總目錄


Dynamic和ExpandoObject映射

AutoMapper不用任何配置就可以從dynamic(動態)對象映射或映射到dynamic對象。

namespace FifthAutoMapper
{
    //定義一個Person類
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
    //主程序
    class Program
    {
        static void Main(string[] args)
        {
            //不需要CreateMap同樣可以映射,這就是所謂的“零配置”
            //Mapper.CreateMap<MyDynamicClass, Person>().ReverseMap();

            //將一個動態對象映射到一個普通實例
            dynamic dynamicObj = new ExpandoObject();//ExpandoObject對象包含可在運行時動態添加或移除的成員
            dynamicObj.Age = 103;
            dynamicObj.Name = "tkb至簡";
            Person person = Mapper.Map<Person>(dynamicObj);
            Console.WriteLine("person.Age={0},Name={1}", person.Age, person.Name);

            //將一個普通實例映射到動態對象
            dynamic dynamicObj2= Mapper.Map<ExpandoObject>(person);
            Console.WriteLine("dynamicObj2.Age={0},Name={1}", dynamicObj2.Age, dynamicObj2.Name);
            Console.Read();
        }
    }
}

關於這個程序的說明,代碼中都注釋得很清楚了,不需再多做解釋。

扁平化

對象與對象之間的映射的通常用法就是將一個復雜的模型壓扁成一個更為簡單的模型。為了演示需要,我這裡定義幾個類,代碼如下:

namespace FifthAutoMapper
{
    public class Order
    {
        public Customer Customer { get; set; }

        public decimal GetTotal()
        {
            return 100M;
        }
    }


    public class Customer
    {
        public string Name { get; set; }
    }

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

}

Order類:就是一個普通的訂單類,當然,實際的項目肯定會有很多的屬性,這裡為了方便演示,只保留一個屬性和一個方法。

Customer類:顧客類,定義了顧客的姓名。

OrderDto類:Order扁平化後的類,包含了特定需求的數據。

官方定義:當使用CreateMap方法在AutoMapper中配置源類型和目標類型時,配置器會嘗試將源上的屬性和方法匹配到目標的屬性上。如果目標屬性的任何屬性在源類型的屬性,方法或者以Get為前綴的方法都不存在,那麼AutoMapper會把目標成員的名稱(按照PascalCase慣例)分割成獨立的單詞。

下面測試一下,在Main方法中添加如下代碼:

Mapper.CreateMap<Order, OrderDto>();
var order = new Order()
{
    Customer = new Customer() {Name = "tkb至簡"},
};
var orderDto= Mapper.Map<OrderDto>(order);
Console.WriteLine(orderDto.CustomerName);
Console.WriteLine(orderDto.Total);

image

雖然前面的博客已經說了很多了,但這裡還是在啰嗦地解釋一下。

我們在AutoMapper的Createmap方法中配置了類型映射。AutoMapper只能映射它知道的類型對,因此我們使用CreateMap顯示地注冊了源/目標類型對。為了執行映射,我們使用Map方法。

在OrderDto類中,Total屬性匹配到了Order上的GetTotal方法。CustomerName屬性匹配到了Order上的Customer.Name屬性。總之,只要合適地命名目標類型屬性,我們就不必配置單獨的屬性匹配。

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