【问题标题】:Asp.net restful web service, operation on more than one resource in the same transactionasp.net restful web service,在同一个事务中对多个资源的操作
【发布时间】:2015-11-05 16:08:08
【问题描述】:

我对asp.net restful web service的理解是,对于每一个资源,都有对应的get、post、delete、put动词。

但是如果我必须向需要对多个资源进行操作的服务器提交请求怎么办? 例如,对于提交表单,我必须要求服务器创建一个order,并在同一个请求中创建一个新的order history。 对我来说,我将orderan order history 定义为两个不同的资源。 而如果我们遵循 ASP.NET MVC Web api RESTful Web 服务,我们将创建两个控制器,一个名为 OrderController,另一个名为 OrderHistoryController。 每个控制器都有“get,post,delete,put”动词。

问题是我们如何确保订单的创建和订单历史的创建在一个事务中? 创建 Order 后,如何以及何时调用 OrderHistoryController 的 post 方法来创建 OrderHistory?

我目前不确定如何使用 OrderHistory 作为资源来实现这一目标。

感谢您的回答。

【问题讨论】:

    标签: asp.net asp.net-mvc-4 asp.net-web-api2 restful-architecture


    【解决方案1】:

    对于初学者,您可能不希望在OrderHistories 中执行 PUT 和 DELETE 操作。能够更改/删除历史记录通常不是一个好主意。 (您可能甚至不希望对该资源进行 POST 操作。无论何时创建/修改/删除 Order,服务器端逻辑都应创建自己的 OrderHistory 对象。)

    除此之外……

    您不需要跨多个 HTTP 请求维护事务(或更一般地说,是一个工作单元)。每个请求本身都是一个孤立的原子工作单元。

    所以基本上你在这里要做的就是向Orders 资源发出一个POST 来创建一个Order 对象。此操作中的服务器端逻辑将在同一工作单元内创建任何必要的对应记录 OrderHistories

    根据您从这些资源中选择的方式,您会从查询它们所需的 POST 操作返回信息。例如,您不太可能想立即通过其自己的标识符查询OrderHistory,您可能会通过Order ID 进行查询。因此,在创建Order 对象时,客户端可以根据需要使用返回的服务器生成的该对象的 ID 来查询OrderHistories


    归根结底,听起来这里的混淆是由于错误的概念,即 RESTful 服务基本上是对数据库表的传递操作集。它不是。消费客户端不应该负责维护事务完整性或关系完整性。服务器端操作维护这一点。

    【讨论】:

    • 听起来这里的混淆来自于错误的概念,即 RESTful 服务基本上是对数据库表的传递操作集。它不是。这正是我的困惑所在。非常感谢。
    • @Ike:API 的第一条规则是从不直接在 API 中公开您的数据库结构。你希望这两件事能够相互独立地改变。添加/删除/更改列/表不应该是对公共 API 的重大更改。
    • 谢谢,很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多