Сопоставить IList с ICollection через AutoMapper - PullRequest
0 голосов
/ 30 марта 2011
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 элементов OrderItems с ICollection.Я пытался использовать resolver, но в итоге получился рекурсивный, так как OrderItem имеет ссылку Order.

Есть идеи?

1 Ответ

4 голосов
/ 31 марта 2011

Во-первых, я добавил несколько настроек в ваши классы. Одним из них было добавить конструкторы, которые инициализируют коллекции, чтобы я мог добавить их в свой тест. Во-вторых, я не понимаю, почему вы хотите, чтобы OrderDTO.OrderItems был свободно типизированной коллекцией ICollection. Если вы сделаете это, Automapper просто назначит IList для ICollection (поскольку IList реализует ICollection). Если вы определите его как IList, Automapper увидит, что он знает, как преобразовать OrderItem в OrderItemDTO, и сопоставит каждого члена коллекции.

Мне также пришлось добавить некоторые Ignore (), поскольку OrderItemDTO не содержит ни IdentifiableCode, ни TotalCost (не уверен, что вы хотели с ними сделать). Наконец, отображение родителя / потомка (OrderItemDTO, имеющее ссылку на своего родителя) может быть выполнено простым циклом foreach в AfterMap (). Итак, вот карта, которую я придумал:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...