asp.net C#从平面视图模型到嵌套Dto的自动Map器

hmae6n7t  于 11个月前  发布在  .NET
关注(0)|答案(1)|浏览(91)

我试图将一个基本上扁平化的视图模型Map到一个具有嵌套对象的Dto。由于视图模型属性的名称与Dto不同,因此很难做到这一点。下面是我们正在使用的示例。

// --- Source ---
public class OrderView 
{ 
  public int order_id {get; set;}
  public string customer_name {get; set;}
  public string customer_last_name {get; set;}
}

public class Order 
{ 
  public int Id {get; set;}
}

public class Customer 
{ 
  public string Name {get; set;}
  public string LastName {get; set;}
}

// --- Dest ---
public class OrderDto
{ 
  public Order Order {get; set;}
  public Customer Customer {get; set;}
}

字符串
一般来说,我只会反转Map,这将工作,但我试图找出如何做到这一点,在一个更干净的方式比以下:

var result = new OrderDto
{
  Order = _mapper.Map<Order>(orderView),
  Customer = _mapper.Map<Customer>(orderView)
}


我想知道这样的事情是否可能

var result = _mapper.Map<OrderDto>(orderView);


提前感谢你的提示。

odopli94

odopli941#

从理论上讲,是的。你必须在intOrderDto之间建立一个Map:

CreateMap<OrderView, OrderDto>()
    .ForMember(dest => dest.Order, mce => mce.MapFrom(ov => ov.order_id));
CreateMap<int, Order>()
    .ConstructUsing(x => new Order() { Id = x });

字符串
但是你可以问自己一个问题,这是否是一个有效的情况下AutoMapper。这种Map仍然可以被认为是'自动'?Map之间的intOrder
作为个人规则,任何使用超过.Ignore()的Map配置文件在我看来都是一种代码气味,可能最好使用手动Map来解决。这是因为复杂的Map经常隐藏业务逻辑,并且任何人都不希望业务逻辑出现在AutoMapper配置文件中。例如,如果源类和目标类之间的属性名称不匹配,在这两者之间有隐藏的业务逻辑需要转换。您最好使用手动Map:

var result = new OrderDto
{
    Order = new Order
    {
        Id = orderView.order_id
    },
    Customer = new Customer
    {
        Name = orderView.customer_name,
        LastName = orderView.customer_last_name
    }
}


这将业务逻辑放在正确的位置(在完整视图中!),比我上面给出的复杂AutoMapperMap更具可读性,并且具有相同数量的代码行。

相关问题