Automapper и коллекция объектов со ссылкой на родительский объект
Вероятно, проще всего, если я объясню это (вымышленным) примером.
У меня есть модель nHibernate, которая содержит объект заказа. Этот объект Order содержит коллекцию объектов OrderItem nHibernate.
У меня есть Order ViewModel, который содержит коллекцию OrderItemDto (которые на самом деле просто POCO).
В моем пользовательском интерфейсе я отображаю объект заказа и список OrderItems, и они редактируются в списке. Привязка модели обеспечивает заполнение коллекций OrderViewModel и OrderItemDto.
Вот моя модель
namespace nHibernateModel
{
public class Order
{
private readonly IList<OrderItem> _OrderItems;
public int Id { get; set; }
public Order()
{
_OrderItems = new List<OrderItem>();
}
public IList<OrderItem> OrderItems
{
/* Setter does not exist to satisfy CA2227*/
get
{
return _OrderItems;
}
}
public void AddOrderItem(OrderItem orderItem)
{
//Set bi-directional relationships
if (_OrderItems.Contains(orderItem))
return;
orderItem.Order = this;
_OrderItems.Add(orderItem);
}
}
public class OrderItem
{
private readonly Order _Order;
public int Id { get; set; }
public Order Order
{
get { return _Order; }
set { value.OrderItems.Add(this); }
}
}
}
Вот мой взгляд-модель / dto
namespace ViewModels
{
public class OrderViewModel
{
public OrderViewModel()
{
OrderItemDtos = new List<OrderItemDto>() ;
}
public IList<OrderItemDto> OrderItemDtos;
public int Id { get; set; }
}
public class OrderItemDto
{
public int Id { get; set; }
}
}
Моя проблема заключается в том, как сопоставить коллекцию OrderItemDto с коллекцией объектов OrderItem, которые прикреплены к заказу. Я хочу контролировать жизненный цикл объектов orderItem. То есть, если у OrderItemDto есть Id, я хочу получить orderItem из репозитория. Если он не существует, я хочу создать новый и установить его свойство order в родительский порядок.
Вот псевдокод для того, что я хочу:
public class OrderModelToDtoMap
{
public OrderModelToDtoMap()
{
Mapper.CreateMap<OrderItemDto, OrderItem>();
Mapper.CreateMap<OrderViewModel, Order>()
.ForMember(dest => dest.OrderItems,
opt => opt.ResolveUsing(OrderItemDtosToOrderItemResolver)(src => src.OrderItemDtos));
}
private class OrderItemDtosToOrderItemResolver : IValueResolver
{
protected override ResolveCore(IList<OrderItemDto> source, Order order)
{
foreach (OrderItemDto orderItemDto in source)
{
OrderItem orderItem;
if (orderItemDto.Id == null)
{
orderItem = new OrderItem();
orderItem.Order = order;
}
else
{
OrderItemRepository.Get(orderItemDto.Id);
}
/* Map other properties */
}
}
}
Но очевидно, что это не работает, потому что IValueResolver не работает так.
Этот раздел Как назначить родительскую ссылку для свойства в дочернем элементе с помощью AutoMapper является своего рода аналогом, но не позволяет мне получить OrderItems из репозитория, если они уже существуют.
Спасибо дэйв