假设我有两个对象:
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<Order>()
,则结果只会填充Name
,而不是Customer
或Items
。有没有办法进行递归翻译,或者唯一的选择是手动翻译客户和每个项目?
答案 0 :(得分: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(),
}
}
只要您需要映射到Order DTO,就可以调用它,例如:
return order.ToDto();
ServiceStack Auto Mapping is available on the wiki的更多示例。
ServiceStack的派对线是,如果您的映射需要的不仅仅是默认的传统行为,而这种行为可以从自动映射器中获取,那么您应该将其包装在DRY扩展方法后面,这样您的映射所需的扩展和自定义就可以清晰地表达并轻松维护码。对于ServiceStack中的许多内容,建议使用此方法,例如:在代码中维护非常规和复杂的IOC绑定,而不是依赖于模糊的重量级IOC功能。
如果您愿意,可以采用AutoMapper等第三方工具。
答案 1 :(得分:3)
您将不得不自己明确处理复杂的映射。以下是ServiceStack src中的一些单元测试,它们显示了当前处理复杂类型的方式。
您可以看到Car对象被序列化为JSON。
var user = new User() {
FirstName = "Demis",
LastName = "Bellot",
Car = new Car() { Name = "BMW X6", Age = 3 }
};
var userDto = user.TranslateTo<UserDto>();
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旨在减少依赖性。