2011-03-30 1 views
0
public class Order 
{ 
    public int OrderId { get; set; } 
    public string OrderCode { get; set; } 
    public IList<OrderItem> OrderItems { get; set; } 
} 

public class OrderDTO 
{ 
    public string OrderId { get; set; } 
    public string IdentifiableCode { get; set; } 
    public decimal TotalCost { get; set; } 
    public ICollection OrderItems { get; set; } 
} 

public class OrderItem 
{ 
    public int OrderItemId { get; set; } 
    public int ItemCount { get; set; } 
    public Order Order { get; set; } 
} 

public class OrderItemDTO 
{ 
    public int OrderItemId { get; set; } 
    public int ItemCount { get; set; } 
    public OrderDTO Order { get; set; } 
} 

이 시나리오에서는 어떻게 IList of OrderItems를 ICollection에 매핑 할 수 있습니까? Resolver를 사용하려고 시도했지만 OrderItem에 Order 참조가 있으므로 재귀 적으로 종료되었습니다.AutoMapper를 통해 IList에 ICollection 매핑

아이디어가 있으십니까?

답변

4

먼저, 수업에 몇 가지 비법을 추가했습니다. 하나는 컬렉션을 초기화하는 생성자를 추가하여 테스트에서 추가 할 수 있도록하는 것이 었습니다. 둘째, 왜 OrderDTO.OrderItems가 느슨하게 형식화 된 ICollection이 될지 알고 싶지 않습니다. 그렇게하면 Automapper는 (IList가 ICollection을 구현했기 때문에) IList를 ICollection에 할당합니다. Automapper는이를 IList로 정의하면 OrderItem을 OrderItemDTO로 변환하는 f}을 알고 컬렉션의 각 구성원을 맵핑합니다.

또한 OrderItemDTO에는 IdentifiableCode 또는 TotalCost (사용자가 그 작업을 수행하기를 원했는지 확실하지 않음)가 포함되어 있으므로 Ignore()의 일부를 추가해야했습니다. 마지막으로 부모/자식 매핑 (부모에 대한 참조가있는 OrderItemDTO)은 AfterMap()의 간단한 foreach 루프에서 수행 할 수 있습니다. 그래서 여기 내가 생각 해낸 매핑입니다 :

Mapper.CreateMap<Order, OrderDTO>() 
    .ForMember(d => d.IdentifiableCode, o => o.Ignore()) 
    .ForMember(d => d.TotalCost, o => o.Ignore()) 
    .AfterMap((s, d) => 
       { 
        foreach (var l in d.OrderItems) 
        { 
         l.Order = d; 
        } 
       }); 
Mapper.CreateMap<OrderItem, OrderItemDTO>(); 
Mapper.AssertConfigurationIsValid(); 

는 그리고 여기에 내가 일을 확인하는 데 사용되는 테스트입니다 :

var order = new Order 
       { 
        OrderCode = "AAA", 
        OrderId = 22, 
        OrderItems = new List<OrderItem>(), 
       }; 
order.OrderItems.Add(new OrderItem { ItemCount = 2, Order = order, OrderItemId = 33 }); 
order.OrderItems.Add(new OrderItem { ItemCount = 1, Order = order, OrderItemId = 99 }); 

var mapped = Mapper.Map<Order, OrderDTO>(order); 
+0

왜 foreach 루프와 aftermap 구현해야합니까. 자동 매핑되지 않습니까? 나 같은 초보자들에게 이걸 더 잘 보여줄 수 있니? – batmaci