TableController:将持久数据展平为DTO

时间:2016-05-11 22:28:12

标签: entity-framework azure azure-mobile-services

我是Azure App Service移动应用的新手。我正在尝试理解使用TableController向客户端公开复杂域对象的选项。我使用TableController的目的是利用客户端查询和离线同步。

表控制器旨在对简单DTO执行CRUD操作。所以我试图找出一个复杂的域模型如何作为TableController设计的DTO来公开。

我读过this post,其中解释了MappedEntityDomainManager。该示例显示了DTO和持久对象之间相当简单的映射。但是,如果我希望我的映射更复杂呢?

例如,假设我有这样的持久类型:

public class Order {
    public Customer Customer { get; set; }
    public IList<OrderItem> OrderItems { get; }
}

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

public class OrderItem { ... }

我有一个像这样声明的表控制器:

public class OrderController : TableController<OrderDto>

那么OrderDto会是这样的吗?

public class OrderDto {
    public string CustomerName { get; }
    public string Customer { get; }
    public string OrderItems { get; }
}

映射如下。 Order.Customer.Name属性已展平为OrderDto.CustomerName。完整的Customer对象序列化为OrderDto.CustomerOrder.OrderItems列表已序列化为OrderDto.OrderItems

这种复杂的映射可以用MappedEntityDomainManager完成吗?如果没有,那怎么办呢?我知道leveraging $expand,但我担心这可能是一个不受支持的黑客而不是推荐的方法。

1 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是使用Automapper。博客文章是一个简单的例子,但您可以使用automapper进行非常复杂的映射。

这是一个更复杂的例子:https://github.com/paulbatum/FieldEngineerLite/blob/master/FieldEngineerLite.Service/Controllers/JobController.cs。它适用于Azure移动服务,但同样的概念适用于Azure移动应用程序。您只需要更改名称空间。