簡單使用AutoMapper實現DTO轉換

libingql發表於2014-06-04

  DTO(Data Transfer Object)資料傳輸物件,只是傳輸資料,完成與領域物件之間的轉換,並不包含領域業務處理。
  當領域模型設計人員只關注核心業務,滿足於領域模型的精巧,而不關心具體實現的時候,DTO就會大量出現。

  系統複雜化後,DTO可能是多個Domain Model組合實現。

  為什麼要使用DTO?
  1、隔離Domain Model,使改動領域模型而不影響UI,保持領域模型的安全,不暴露業務邏輯。
  2、在分散式模式下,不同的場景使用相同的資料結構有不同的需求。

 

  簡單示例:

  Order.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppExample
{
    public class Order
    {
        public int OrderID { get; set; }

        public string OrderNumber { get; set; }

        public DateTime OrderDate { get; set; }
    }
}

  OrderDTO.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppExample
{
    public class OrderDTO
    {
        public int OrderID { get; set; }

        public string OrderNumber { get; set; }

        public DateTime OrderDate { get; set; }

        public int OrderYear { get; set; }
    }
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Order order = new Order
            {
                OrderID = 1,
                OrderNumber = "201406040001",
                OrderDate = DateTime.Now
            };

            AutoMapper.Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Order, OrderDTO>()
                    .ForMember(dest => dest.OrderYear, opt => opt.MapFrom(src => src.OrderDate.Year));
            });

            OrderDTO orderDTO = AutoMapper.Mapper.Map<Order, OrderDTO>(order);

            Console.WriteLine("{0}-{1}-{2}-{3}", orderDTO.OrderID, orderDTO.OrderNumber, orderDTO.OrderDate, orderDTO.OrderYear);
        }
    }
}

相關文章