我正在寻找使用Automapper处理此问题的最佳方法
我的简化域模型(所有ID由数据库自动生成):
public class Product
{
public long Id { get; set; }
public List<OrderProduct> OrderProducts { get; set; }
}
public class Order
{
public long Id { get; set; }
public List<OrderProduct> OrderProducts { get; set; }
}
public class OrderProduct
{
public long Id { get; set; }
public long ProductId { get; set; }
public long OrderId { get; set; }
public Product Product { get; set; }
public Order Order { get; set; }
}
我的DTO对象:
public class CreateOrderDTO
{
public long Id { get; set; }
public List<long> ProductIds { get; set; }
}
现在,我需要从CreateOrderDTO映射到Order对象。使用自动映射器实现此目标的最佳方法是什么?我可以使用普通的C#映射它-但是,我真的很想知道使用Automapper进行此操作的正确方法。
答案 0 :(得分:0)
假设您已经安装了Automapper。
这是配置映射的一种方法。
您创建映射配置文件,应该从Profile对象继承,然后在配置文件的构造器中创建映射:
public class OrderProfile : Profile
{
public OrderProfile()
{
CreateMap<CreateOrderDTO, Order>().ForMember(c => c.OrderProducts, m => m.MapFrom(l => CreateOrderProducts(l.ProductIds)));
}
private static List<OrderProduct> CreateOrderProducts(IList<long> productIds)
{
IList<OrderProduct> orderProducts = new List<OrderProduct>();
foreach (long id in productIds)
{
orderProducts.Add(new OrderProduct
{
ProductId = id
});
}
return orderProducts.ToList();
}
}
注意:我认为您需要手动将您的ProductIds List<long>
映射到List<OrderProduct>
,并且您也应该在个人资料中进行此操作。
接下来,您配置一个AutoMapper:
public static class MappingConfig
{
public static MapperConfiguration Configure()
{
MapperConfiguration config = new MapperConfiguration(cfg =>
{
cfg.AddProfile<OrderProfile>();
});
return config;
}
}
这是通过MapperConfiguration的构造函数进行配置(即添加配置文件)的一种方法,您也可以使用静态Mapper实例http://docs.automapper.org/en/stable/Configuration.html进行此操作。
用法:
然后您可以创建一个映射器实例,最好是,您的应用程序中应该只包含一个映射器实例,因此将映射器注册到ioc容器中始终是一个好主意。
static void Main(string[] args)
{
var mapper = MappingConfig.Configure().CreateMapper();
CreateOrderDTO dto = new CreateOrderDTO
{
Id = 1,
ProductIds = new List<long> { 23L }
};
// Here it appears that it's as if you didn't do any manual mapping.
Order order = mapper.Map<CreateOrderDTO, Order>(dto);
Order order = mapper.Map<CreateOrderDTO, Order>(dto);
Console.WriteLine("Order Id: " + order.Id);
Console.WriteLine("Product Id: " + order.OrderProducts.Select(o => o.ProductId).First());
Console.ReadLine();
}
如果发现这没有帮助,可以将其否决,我将其删除,因为我希望读者不要对正确的做事方式感到困惑。