如何在ServiceStack中翻译复杂对象?

koj*_*ojo 4 c# servicestack

假设我有两个对象:

class Order
{
    string Name {get; set;}
    Customer Customer {get; set;}
    Item[] Items {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

class OrderDTO
{
    string Name {get; set;}
    CustomerDTO Customer {get; set;}
    ItemDTO[] Items {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

如果我收到一个orderDTO完全填充的对象,orderDTO.TranslateTo<Order>()那么结果只会Name填充,而不是CustomerItems.有没有办法进行递归转换,或者唯一的选择是手动翻译客户和每个项目?

myt*_*thz 5

我会将它包装在一个可重用的扩展方法中,例如:

public static OrderDTO ToDto(this Order from)
{
    return new OrderDTO { 
        Name = from.Name,
        Customer = from.ConvertTo<CustomerDTO>(),
        Items = from.Items.Map(x => x.ConvertTo<ItemDTO>()).ToArray(),
    }
}
Run Code Online (Sandbox Code Playgroud)

只要您需要映射到订单DTO,就可以调用它,例如:

return order.ToDto();
Run Code Online (Sandbox Code Playgroud)

维基上提供了ServiceStack 自动映射的更多示例.

ServiceStack的派对线是,如果您的映射需要的不仅仅是可以从自动映射器中提取的默认传统行为,那么您应该将其包装在DRY扩展方法后面,这样您的映射所需的扩展和自定义就可以清晰地表达并在代码中轻松维护.对于ServiceStack中的许多内容,建议使用此方法,例如,在代码中维护非常规和复杂的IOC绑定,而不是依赖于模糊的重量级IOC功能.

如果你喜欢它,你当然可以采用像AutoMapper这样的第三方工具.