Azure 移动服务应用程序的体系结构
Architecture of Azure Mobile Services Application
我正在尝试为 Windows 通用应用拼凑一个架构,利用 Azure 移动服务。这是一个 LOB 应用程序,需要处理 100-250 offline\online 个表。目前 Mobile Services 不支持嵌套的复杂对象,因此在服务端,我已经直接从 entity framework.
映射了大部分表
我的问题是我是否应该使用一个单独的层来重构 DTO,或者我是否应该通过服务层和视图模型来完成这一切。我主要关心的是责任的隔离(大型团队)和额外映射带来的性能开销。
没有为模型添加图像的声誉link。
一个例子是一个附加了地址集合的 Person 对象。我有三个 DTO 对象:一个用于人,一个用于地址,一个用于多对多关系。如果我直接映射到视图模型,我需要寻址服务来查找特定人的地址。
如果我插入一个额外的 "Model" 层,我的服务 returns 带有地址集合的个人模型。不过感觉有点不对...
正确的选择取决于您在客户端上的查询方式。在您的情况下,您想直接查询地址,因此在客户端上有一个地址 table 可能会有所帮助。
映射到DTO的原因正如你所说:Azure移动服务中没有直接支持对象之间的关系。这是为了确保客户端和服务器之间的交互模型简单,但当数据模型确实涉及关系时,这可能意味着更多的设计。
一般来说,我们建议如下:
如果您有 1:many 关系,其中父子对象之间存在明确的所有权关系,通常最好将子对象映射到父对象。这也简化了移动客户端创建新的子对象并与父对象关联的情况。离线同步协议单独发送更改,因此如果对象需要成为一个原子操作,则必须将它们组合在一起。有关此示例,请参阅 FieldEngineerLite sample.
如果您有 1:many 关系并且直接查询子对象并不重要,您可以像 #1 中那样映射,或者创建单独的 table 控制器子项并使用外键管理映射。
对于 many:many 关系,直接暴露关系 table 通常会增加太多的复杂性。在这里,考虑将对象 ID 展平到其中一个对象中。在您的示例中,客户 DTO 可能有一个地址 ID 列表,并且地址在客户端上属于它们自己的 table。
如果您选择执行选项 #3,您的代码需要确保将所有相关地址发送到客户端。您可以 a) 映射到扁平化对象,然后在客户端解压缩,或者 b) 向客户端或服务器端地址查询添加子句,以便客户端获得所有正确的数据。
在情况 (b) 中,您还应确保在对客户 table 进行查询之前下拉对地址 table 的更改。如果可以执行查询来确定要下拉的地址范围,则情况 (b) 很容易实现。
例如,假设您正在构建一个 CRM 应用程序,其中使用该应用程序将客户分配给销售人员。然后,您对 Customer 和 Address 进行联接,并仅获取属于已登录用户拥有的客户的那些地址。
我正在尝试为 Windows 通用应用拼凑一个架构,利用 Azure 移动服务。这是一个 LOB 应用程序,需要处理 100-250 offline\online 个表。目前 Mobile Services 不支持嵌套的复杂对象,因此在服务端,我已经直接从 entity framework.
映射了大部分表我的问题是我是否应该使用一个单独的层来重构 DTO,或者我是否应该通过服务层和视图模型来完成这一切。我主要关心的是责任的隔离(大型团队)和额外映射带来的性能开销。
没有为模型添加图像的声誉link。
一个例子是一个附加了地址集合的 Person 对象。我有三个 DTO 对象:一个用于人,一个用于地址,一个用于多对多关系。如果我直接映射到视图模型,我需要寻址服务来查找特定人的地址。
如果我插入一个额外的 "Model" 层,我的服务 returns 带有地址集合的个人模型。不过感觉有点不对...
正确的选择取决于您在客户端上的查询方式。在您的情况下,您想直接查询地址,因此在客户端上有一个地址 table 可能会有所帮助。
映射到DTO的原因正如你所说:Azure移动服务中没有直接支持对象之间的关系。这是为了确保客户端和服务器之间的交互模型简单,但当数据模型确实涉及关系时,这可能意味着更多的设计。
一般来说,我们建议如下:
如果您有 1:many 关系,其中父子对象之间存在明确的所有权关系,通常最好将子对象映射到父对象。这也简化了移动客户端创建新的子对象并与父对象关联的情况。离线同步协议单独发送更改,因此如果对象需要成为一个原子操作,则必须将它们组合在一起。有关此示例,请参阅 FieldEngineerLite sample.
如果您有 1:many 关系并且直接查询子对象并不重要,您可以像 #1 中那样映射,或者创建单独的 table 控制器子项并使用外键管理映射。
对于 many:many 关系,直接暴露关系 table 通常会增加太多的复杂性。在这里,考虑将对象 ID 展平到其中一个对象中。在您的示例中,客户 DTO 可能有一个地址 ID 列表,并且地址在客户端上属于它们自己的 table。
如果您选择执行选项 #3,您的代码需要确保将所有相关地址发送到客户端。您可以 a) 映射到扁平化对象,然后在客户端解压缩,或者 b) 向客户端或服务器端地址查询添加子句,以便客户端获得所有正确的数据。
在情况 (b) 中,您还应确保在对客户 table 进行查询之前下拉对地址 table 的更改。如果可以执行查询来确定要下拉的地址范围,则情况 (b) 很容易实现。
例如,假设您正在构建一个 CRM 应用程序,其中使用该应用程序将客户分配给销售人员。然后,您对 Customer 和 Address 进行联接,并仅获取属于已登录用户拥有的客户的那些地址。