如何实际使用Azure移动服务(跨平台客户端)?

时间:2014-05-19 11:00:47

标签: c# rest mobile azure xamarin

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

如果有人知道如何将Azure移动服务用于实际项目,请向我提供一些示例/想法,了解移动应用程序的便携式服务层如何与Azure移动服务后端进行交互。对于客户端应用程序,我使用Xamarin工具。

2 个答案:

答案 0 :(得分: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试用版 - 足以熟悉环境)。

答案 1 :(得分:0)

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

Generated Table控制器仅处理一个实体,因此scaffolding将为ToDoList实体创建ToDoListController,为ToDoListItem创建ToDoListItemController,为ToDoListItemDetail实体创建ToDoListItemDetailController。但是,您在Web应用程序中定义的所有实体共享相同的Context,因此可以在任何控制器中查询所有实体。因此,默认情况下,您只能执行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和Version。但即使您必须复制DataObjects(后端)或DTO /模型(客户端)的定义,也只能复制它。

如果您需要调用与表存储无关的端点,则可以按照本文(<{3}})的使用自定义API 部分中的说明调用自定义API。

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