如果我用一个(虚构的)例子来解释这一点,这可能是最简单的。
我有一个包含 Order 对象的 nHibernate 模型。此 Order 对象包含 OrderItem nHibernate 对象的集合。
我有一个 Order ViewModel,其中包含 OrderItemDto 的集合(实际上只是 POCO)。
在我的 UI 中,我显示了一个订单对象和一个 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 对象的生命周期。IE,如果 OrderItemDto 有一个 Id,我想从存储库中获取 orderItem。如果它不存在,我想创建一个新的并将其订单属性设置为父订单。
这是我认为我想要的伪代码:
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 不是这样工作的。
这个How to assign parent reference to a property in a child with AutoMapper有点类似,但如果 OrderItems 已经存在,则不允许我从存储库中获取它们。
谢谢,戴夫