我正在寻找使用Automapper处理此问题的最佳方法
我的简化域模型(所有ID都由DB自动生成):
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对象。使用automapper实现这一目标的最佳方法是什么?我可以使用普通的C#映射它 - 但是我真的想知道使用Automapper执行此操作的正确方法。
假设您已经安装了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执行此操作。
用法:
然后,您可以创建映射器的实例,最好在应用程序中只有一个mapper实例,因此在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();
}
如果发现这个无用,你可以把它投下来,我会删除它,因为我希望读者不要对正确的做事方式感到困惑。