AutoMapper(五)

weixin_34162629發表於2015-11-06

返回總目錄


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屬性。總之,只要合適地命名目標型別屬性,我們就不必配置單獨的屬性匹配。

相關文章