9

问题:

当我需要在 WebAPI 中为每个实体实现自己的 POST/PUT/GET 端点时,微风提供了什么价值?

背景:

似乎是服务器端 Breeze 控制器的常见实现:

[BreezeController]
public class TodosController : ApiController {

    readonly EFContextProvider<TodosContext> _contextProvider =
        new EFContextProvider<TodosContext>();

    // ~/breeze/todos/Metadata
    [HttpGet]
    public string Metadata() {
        return _contextProvider.Metadata();
    }

    // ~/breeze/todos/Todos
    // ~/breeze/todos/Todos?$filter=IsArchived eq false&$orderby=CreatedAt
    [HttpGet]
    public IQueryable<TodoItem> Todos() {
        return _contextProvider.Context.Todos;
    }

    // ~/breeze/todos/SaveChanges
    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle) {
        return _contextProvider.SaveChanges(saveBundle);
    }

    // other miscellaneous actions of no interest to us here
}

我正在构建一个 RESTish API,到目前为止,它的端点如下:

GET /api/todo/1
PUT /api/todo
POST /api/todo

Breeze 似乎要求端点要简单得多(无论好坏)——只需一堆GETS 和一个SaveChanges POST 端点。

这使我认为 Breeze 使用单个 Web 客户端进行快速开发,嗯,轻而易举……但是一旦您拥有匿名客户端,您就必须强制它们使用您在客户端中创建的任何轻量接口约定,这似乎违背了 RESTful API 设计的目的。是这样吗?

4

1 回答 1

29

Breeze 首先是一个客户端 JavaScript 框架。如果您不在客户端上使用 Breeze,则 Breeze.WebApi 的好处仅限于

  • 增强的 OData 查询支持($select 和 $expand 支持,扩展 $orderby)
  • 保存拦截点(beforeSaveEntity 和 beforeSaveEntities 事件)
  • 保存结果处理(更新的实体键、并发列)
  • 元数据提取和序列化

正如您所推测的,Breeze 在 CRUD 操作方面与 REST 有不同的理念。

Breeze 专为可能希望在单个事务中 C/U/D 多种不同类型资源的客户而设计。这允许用户以复杂的方式操作数据而无需访问服务器,然后在他们准备好时保存他们的更改。例如,可以创建一个新的Order,将两个OrderLineItems 从一个Order移到另一个,删除第三个OrderLineItem,修改第四个的数量,然后SaveChanges()。Breeze 甚至支持使用 localStorage 在与服务器完全断开连接的情况下工作。重新连接后,所有更改都可以保存。

REST 旨在一次操作一个资源。必须立即对服务器执行每个 C/U/D 操作,以便响应代码可以执行。它适用于具有简单更新需求的应用程序,但不适用于数据输入应用程序。虽然REST 可以支持事务,但它们充其量只是繁琐。

话虽如此,您的服务器端 Breeze API 并不局限于您在 Todos 示例中看到的内容。Breeze 支持Named Saves,它允许您为不同的操作使用不同的端点。您还可以使用保存拦截来确保您的保存包只包含它应该包含的类型。当然,没有什么可以阻止您在服务器上公开这两个 API,并且它们都由同一个持久层提供。

如果你必须在它们之间做出决定,你应该从你的用户开始。真正的用户(不是开发人员)并不关心 REST,他们关心的是应用程序可以做什么。最终,REST 为您的应用程序提供了 HTTP 的所有语义,而 Breeze 为它提供了关系数据库或对象数据库的所有语义。哪一个向您的用户公开应该取决于您需要支持的用例。

于 2013-06-24T23:17:18.750 回答