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

时间:2013-03-14 12:01:10

标签: c# 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;}
}

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

2 个答案:

答案 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旨在减少依赖性。