【问题标题】:How to use Azure Mobile Services practically (cross-platform client)?如何实际使用 Azure 移动服务(跨平台客户端)?
【发布时间】:2014-05-19 11:00:47
【问题描述】:

Azure Mobile 似乎非常有用,因为它具有内置的常用功能,因此我不必自己实现它们。但是,如果我需要的不仅仅是 ToDoItems 的非常简单的示例,我仍然无法理解如何使用它。首先,TableController 似乎非常有用,因为它可以提供持久的服务器功能和客户端通知功能。另一方面,如果 ToDoItem 类位于后端程序集中(当然我想将它包含在移动应用程序中),我无法理解该示例如何用于真实的移动设备。但是,如果我使用一些必须可移植的共享程序集,如果 ITableData 不在可移植子集中,我该如何实现它?在一些实际项目中使用 MobileServiceCollection 和 CollectionChanged 事件的方法是什么?那么问题是如何实现逻辑层——带 DbContext 的持久化模式很好,但有时我需要服务器上的一些逻辑功能而不仅仅是存储。计划的作业似乎不适合,因为我需要通过客户端数据更新而不是某些计划来调用一些数据处理。

如果有人知道如何将 Azure 移动服务用于实际项目,请给我一些示例/想法,用于移动应用程序的可移植服务层如何与 Azure 移动服务后端交互。对于客户端应用程序,我使用 Xamarin 工具。

【问题讨论】:

    标签: c# rest mobile azure xamarin


    【解决方案1】:

    使用 Xamarin 意味着您可以完全在 C# 中工作,因此您可以重复使用在非移动平台上开发 C# 解决方案时会知道的许多概念。例如,您可以共享“DTO”,这意味着您可以在所有平台之间共享代码。见:http://blog.siliconvalve.com/2013/08/16/portable-azure-mobile-services-dtos-when-using-xamarin-and-c/

    我去年在 TechEd Australia 上对此进行了介绍,示例代码也可以在 Github 上找到。演讲视频和示例链接可在此处找到:http://blog.siliconvalve.com/2013/09/08/teched-demo-video-available-online/

    在启动时,移动服务将 Node.js 用于服务器端功能(它仍然受支持),现在也可以使用 C# 开发服务器端脚本。这些不仅限于数据库交互(尽管这些往往是使用的示例)。如果您查看我的示例项目,您会看到我对入站数据进行了一些解析以触发推送通知。

    除了开始使用代码之外,最终没有简单的答案(您可以在短时间内免费运行 Azure 试用版 - 足以熟悉环境)。

    【讨论】:

    • 感谢您提供有关 DTO 的信息,它们确实有效,但我仍然不明白如何 - 它是否仅通过名称确定类对应关系而根本没有映射?此外,我了解 TableController 具有用于更新、插入等的虚拟方法。我可以在逻辑中使用它们,但我有一个疑问 - 事务范围在哪里?我还没有找到明确的答案,但我需要一个真正的持久服务器。
    • 关于 DTO 我刚刚找到了一个 good tutorial。 TableController 问题仍然对我开放。
    【解决方案2】:

    TableController 应该只为一种类型的实体提供 REST API。从根本上说,REST 很简单。你有 ToDoList、ToDoListItem 并且可能对于每个 ToDoListItem 你有多个 ToDoListItemDetail 条目。这表示 3 个实体之间的一对多关系。

    生成的表控制器只处理一个实体,因此脚手架将为 ToDoList 实体创建一个 ToDoListController,为 ToDoListItem 创建一个 ToDoListItemController,为 ToDoListItemDetail 实体创建一个 ToDoListItemDetailController。但是您在 Web 应用程序中定义的所有实体都共享相同的上下文,因此可以在任何控制器中查询所有实体。因此,虽然默认情况下您只能执行 GET /tables/ToDoListItem 这将为您提供所有 ToDoListItems,或者您可以执行 GET /tables/ToDoListItem/{key} 这将为您提供与键匹配的特定 ToDoListItem,但您无法获得匹配的 ToDoListItem一个特定的 ToDoList。

    根据 REST 最佳实践,此类检索将通过 GET /tables/ToDoList/{key}/ToDoListItem 来完成,这将提供与密钥标识的特定 ToDoList 关联的所有 ToDoListItem。现在这在逻辑上属于 ToDoListController,为了扩展控制器来获得它,您需要实现基于属性的路由。

    [RoutePrefix("tables/todolist")]
    public class ToDoListController : TableController<DataObjects.ToDoList>
    {
       ...
       // extended endpoint
       // GET tables/todolist/{key}/todolistitem
       [Route("{id:guid}/todolistitem")]
       public IQueryable<DataObjects.ToDoListItem> GetAllToDoListItemsForToDoList(string id)
       {
          return from l in Context.ToDoLists 
          join li in Context.ToDoListItems on l.Id equals li.ToDoListId
          where l.Id.Equals(id)
          select li;
       }
    

    因此,现在使用这种技术,您可以查询除了脚手架表控制器提供的基本实体之外的任何内容。

    现在,由于您的 Web API 后端必须让 DataObject 类继承自 EntityData,因此您可能无法在 Xamarin 应用程序中完全重用它们。您的 Xamarin 应用程序层也不必实现 EntityData 的所有数据元素 - 可能只有 Id 和版本。但即使您必须复制 DataObjects(后端)或 DTO/Models(客户端)的定义,它的复制量也非常小。

    如果您需要调用与表存储无关的端点,您可以按照本文的使用自定义 API 部分中的说明调用自定义 API (https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-dotnet-how-to-use-client-library#work-with-tables)。

    我不确定我是否回答了您的一些问题,因此请提供更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-17
      • 2016-07-30
      • 1970-01-01
      • 2017-08-12
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多