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); } } }