Structuring/architecting 一个 Azure 移动应用服务 Entity Framework 代码优先和 .NET APK 项目
Structuring/architecting an Azure Mobile Apps Service Entity Framework Code-First and .NET APK project
我是一名经验丰富的 .NET/C# 开发人员,但对这里几乎所有 technologies/libraries 包括 SQL/DB 工作都是新手。
我正在开发一个带有 Azure/Entity Framework .NET 后端和 portable .Net APK 的项目,供许多其他项目使用。我正在尝试遵循推荐的做法和指南,但很难找到文档。我发现自己反复感觉自己在与系统作斗争,并用钝 table 勺子慢慢地扑灭看似无穷无尽的一连串火灾。
我发现自己想知道我使用的整体架构是否是这里的根本问题。我宁愿假装自己不只是无能
当前结构
- DTO合同项目
- DTO 的接口class在其他两个项目之间共享
- 后端项目
- DTO 接口的实现 + 转换 to/from 模型 classes
- 代码优先数据库模型classes
TableController<SOME_DTO_CLASS>
实现
ApiController
用于非查询操作
- Portable SDK 库项目
- DTO 接口的实现 + 转换 to/from SDK classes
- 公开了 SDK class供其他应用程序使用
- 包装
MobileServiceClient
和IMobileServiceTable
并公开SDK classes 的服务class
Motivation/Implementation
合约接口
DTO 合同接口的动机是尽可能远离魔术字符串/依赖成员名称。这些是接口而不是 classes,因为 TableController<T>
需要 ITableData
的实现,它在 portable DTO 合同项目中不可用。
后端
TableController<SOME_DTO_CLASS>
classes GET 方法当前引用当前上下文(不是 this.Query()
)和 .Select()
来创建 DTO [=115= 的匹配实例]是的。延迟加载完好无损。这些 GET 方法应用 .Where()
和 this.User
以仅过滤掉用户有权访问的那些实体。
Code-First 模型完全源自 EntityData
,即使 class 不会通过 TableController<T>
公开。导航属性用于未通过其自身 TableController<T>
公开的类型。流利的API用于描述关系。
DTO classes 将它们的关系属性公开为接口类型而不是它们的具体类型,因为这就是接口的工作方式。
SDK
目前使用 IMobileServiceTable
,但可能会在某个时候切换到 IMobileServiceSyncTable
。
DTO classes 将它们的关系属性公开为接口类型而不是它们的具体类型,因为这就是接口的工作方式。
当前火勺目标
现在我已经成功地公开了从数据库中提取的自己的 SDK 类型。 DB model -> DB DTO --> *MS Code* --> SDK DTO -> SDK exposed class
一切正常。
有点。
公开其他 DB DTO classes 的 DB DTO classes 属性似乎在传输中被忽略,尽管它是 GET 方法中返回的 IQueryable 的一部分。我无法使用 $expand=
检索它们,显然 The specified type member 'TestClass' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
如果我从接口 属性 类型切换到具体类型,这仍然会发生。
我可以通过仅包含外键 ID 并在 SDK 中单独获取链接的实体来潜在地避免这个问题,但这似乎非常低效而且有点不可行。
开始提问你这个凌晨 4 点的傻瓜!
讨厌吗?
更具体地(正式地)这个当前的项目结构是否合理并且可能是可持续的?是否存在任何明显的缺陷或疏忽会阻止其工作?
假设这是合理的,那么解决 DTO $expand 问题的正确方法是什么?
$expand 属性是可行的方法,但不幸的是,Azure 移动客户端 SDK 在查询字符串中阻止了它。它将在未来修复,但目前您最好的选择是在服务器端使用属性在传入请求中添加查询字符串。
有关此示例,请参阅 https://github.com/paulbatum/FieldEngineerLite/blob/master/FieldEngineerLite.Service/Helpers/ExpandPropertyAttribute.cs。该示例适用于 Azure 移动服务,但该代码可以轻松应用于 Azure 移动应用服务器 SDK。
我是一名经验丰富的 .NET/C# 开发人员,但对这里几乎所有 technologies/libraries 包括 SQL/DB 工作都是新手。
我正在开发一个带有 Azure/Entity Framework .NET 后端和 portable .Net APK 的项目,供许多其他项目使用。我正在尝试遵循推荐的做法和指南,但很难找到文档。我发现自己反复感觉自己在与系统作斗争,并用钝 table 勺子慢慢地扑灭看似无穷无尽的一连串火灾。
我发现自己想知道我使用的整体架构是否是这里的根本问题。我宁愿假装自己不只是无能
当前结构
- DTO合同项目
- DTO 的接口class在其他两个项目之间共享
- 后端项目
- DTO 接口的实现 + 转换 to/from 模型 classes
- 代码优先数据库模型classes
TableController<SOME_DTO_CLASS>
实现ApiController
用于非查询操作
- Portable SDK 库项目
- DTO 接口的实现 + 转换 to/from SDK classes
- 公开了 SDK class供其他应用程序使用
- 包装
MobileServiceClient
和IMobileServiceTable
并公开SDK classes 的服务class
Motivation/Implementation
合约接口
DTO 合同接口的动机是尽可能远离魔术字符串/依赖成员名称。这些是接口而不是 classes,因为 TableController<T>
需要 ITableData
的实现,它在 portable DTO 合同项目中不可用。
后端
TableController<SOME_DTO_CLASS>
classes GET 方法当前引用当前上下文(不是 this.Query()
)和 .Select()
来创建 DTO [=115= 的匹配实例]是的。延迟加载完好无损。这些 GET 方法应用 .Where()
和 this.User
以仅过滤掉用户有权访问的那些实体。
Code-First 模型完全源自 EntityData
,即使 class 不会通过 TableController<T>
公开。导航属性用于未通过其自身 TableController<T>
公开的类型。流利的API用于描述关系。
DTO classes 将它们的关系属性公开为接口类型而不是它们的具体类型,因为这就是接口的工作方式。
SDK
目前使用 IMobileServiceTable
,但可能会在某个时候切换到 IMobileServiceSyncTable
。
DTO classes 将它们的关系属性公开为接口类型而不是它们的具体类型,因为这就是接口的工作方式。
当前火勺目标
现在我已经成功地公开了从数据库中提取的自己的 SDK 类型。 DB model -> DB DTO --> *MS Code* --> SDK DTO -> SDK exposed class
一切正常。
有点。
公开其他 DB DTO classes 的 DB DTO classes 属性似乎在传输中被忽略,尽管它是 GET 方法中返回的 IQueryable 的一部分。我无法使用 $expand=
检索它们,显然 The specified type member 'TestClass' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
如果我从接口 属性 类型切换到具体类型,这仍然会发生。
我可以通过仅包含外键 ID 并在 SDK 中单独获取链接的实体来潜在地避免这个问题,但这似乎非常低效而且有点不可行。
开始提问你这个凌晨 4 点的傻瓜!
讨厌吗?
更具体地(正式地)这个当前的项目结构是否合理并且可能是可持续的?是否存在任何明显的缺陷或疏忽会阻止其工作?
假设这是合理的,那么解决 DTO $expand 问题的正确方法是什么?
$expand 属性是可行的方法,但不幸的是,Azure 移动客户端 SDK 在查询字符串中阻止了它。它将在未来修复,但目前您最好的选择是在服务器端使用属性在传入请求中添加查询字符串。
有关此示例,请参阅 https://github.com/paulbatum/FieldEngineerLite/blob/master/FieldEngineerLite.Service/Helpers/ExpandPropertyAttribute.cs。该示例适用于 Azure 移动服务,但该代码可以轻松应用于 Azure 移动应用服务器 SDK。