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

假设我有两个对象:

class Order { string Name {get; set;} Customer Customer {get; set;} Item[] Items {get; set;} } 

 class OrderDTO { string Name {get; set;} CustomerDTO Customer {get; set;} ItemDTO[] Items {get; set;} } 

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

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

 public static OrderDTO ToDto(this Order from) { return new OrderDTO { Name = from.Name, Customer = from.ConvertTo(), Items = from.Items.Map(x => x.ConvertTo()).ToArray(), } } 

无论何时需要映射到订单DTO,都可以调用,例如:

 return order.ToDto(); 

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

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

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

您将不得不自己明确地处理复杂的映射。 以下是来自ServiceStack src的一些unit testing,它们显示了当前处理复杂类型的方式。

您可以看到Car对象被序列化为JSON。

 var user = new User() { FirstName = "Demis", LastName = "Bellot", Car = new Car() { Name = "BMW X6", Age = 3 } }; var userDto = user.TranslateTo(); Assert.That(userDto.FirstName, Is.EqualTo(user.FirstName)); Assert.That(userDto.LastName, Is.EqualTo(user.LastName)); Assert.That(userDto.Car, Is.EqualTo("{Name:BMW X6,Age:3}")); 

我同意Trust Me – 我是Automapper值得使用的医生。 内置的Translating旨在减少依赖性。