Mobile OData实体设计:用于查询的附加字段

Mobile OData实体设计:用于查询的附加字段,mobile,odata,ado.net-entity-data-model,Mobile,Odata,Ado.net Entity Data Model,我们目前正在设计一个OData兼容的实体数据模型,该模型将由移动应用程序使用。团队分为两部分;提供OData服务的后端开发人员和使用这些服务的前端开发人员 前端和后端开发人员之间的一个分歧点是关于主要实体的设计。从前端的角度来看,它应该如下所示: Order: Order ID Order Type Assigned To Customer ID Price Currency etc... http://SERVICE_ROOT_URL/Orders?$filter=Request_Code

我们目前正在设计一个OData兼容的实体数据模型,该模型将由移动应用程序使用。团队分为两部分;提供OData服务的后端开发人员和使用这些服务的前端开发人员

前端和后端开发人员之间的一个分歧点是关于主要实体的设计。从前端的角度来看,它应该如下所示:

Order:
Order ID
Order Type
Assigned To
Customer ID
Price
Currency
etc...
http://SERVICE_ROOT_URL/Orders?$filter=Request_Code eq '0022' // The orders requiring approval and the current user can approve them
http://SERVICE_ROOT_URL/Orders?$filter=Request_Code eq '0027' // The orders with the open status
将使用以下URL查询订单对象:

http://SERVICE_ROOT_URL/Orders?$filter=Order_Type eq 'Inquiry' or Order_Type eq 'Quotation'
http://SERVICE_ROOT_URL/Orders?$filter=Order_Type eq 'Inquiry' and Assigned_To eq 'James7'
后端开发人员愿意向订单实体添加一个新字段,并使用此字段了解用户查询的内容。让我们将这个新字段命名为
请求代码
。使用“请求代码”字段,查询将如下所示:

Order:
Order ID
Order Type
Assigned To
Customer ID
Price
Currency
etc...
http://SERVICE_ROOT_URL/Orders?$filter=Request_Code eq '0022' // The orders requiring approval and the current user can approve them
http://SERVICE_ROOT_URL/Orders?$filter=Request_Code eq '0027' // The orders with the open status
基本上,
请求代码
不是实体的实际部分,而是人工的。它只是增加了一些智能,以便后端查询变得更容易。这样,后端将只支持具有此请求代码的查询。
请求代码
也计划在更新场景中使用,在更新
订单
实体时,前端预计将通过
请求代码
。这样,后端将通过查看请求代码知道要更新哪些字段

我在前端,我不认为
请求代码
应该包含在模型中。它使设计加密,并消除了OData服务的简单性。除了在后端使事情变得更简单之外,我也看不到任何附加值


这是OData服务设计中的常见做法吗?

对我来说,这个额外属性是不合适的。它在OData之上增加了一层额外的语义;这需要额外的理解和额外的编码来处理。它只是增加了一个漏洞,它将一个后端实现细节泄漏到了它的公共API中

OData查询接口应该足以描述大多数情况。当这还不够时,您可以创建来描述额外的业务语义

例如,这个:

/Orders?$filter=Request_Code eq '0022' // The orders requiring approval and the current user can approve them
/Orders?$filter=Request_Code eq '0027' // The orders with the open status
可能会变成这样:

/GetOrdersRequiringApprovalFromUser
/GetOpenOrders
另外,对于更新逻辑,OData已经支持


总之,不要在OData之上发明另一个协议。使用它提供的功能。

对我来说,这个额外的属性是不合适的。它在OData之上增加了一层额外的语义;这需要额外的理解和额外的编码来处理。它只是增加了一个漏洞,它将一个后端实现细节泄漏到了它的公共API中

OData查询接口应该足以描述大多数情况。当这还不够时,您可以创建来描述额外的业务语义

例如,这个:

/Orders?$filter=Request_Code eq '0022' // The orders requiring approval and the current user can approve them
/Orders?$filter=Request_Code eq '0027' // The orders with the open status
可能会变成这样:

/GetOrdersRequiringApprovalFromUser
/GetOpenOrders
另外,对于更新逻辑,OData已经支持

总之,不要在OData之上发明另一个协议。使用它提供的东西