问题:
当我需要在WebAPI中为每个实体实现自己的POST / PUT / GET端点时,breeze提供了什么价值?
背景
This似乎是服务器端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设计的目的。是这种情况吗?
答案 0 :(得分:29)
Breeze是第一个和formost,一个客户端JavaScript框架。如果您没有在客户端上使用Breeze,Breeze.WebApi的好处仅限于
正如您所推测的那样,Breeze与REST在CRUD操作方面有着不同的理念。
Breeze专为那些可能希望在单个事务中使用不同类型的C / U / D资源的客户而设计。这允许用户以复杂的方式操作数据而无需访问服务器,然后在准备好时保存更改。例如,可以创建一个新的Order
,将两个OrderLineItem
从一个Order
移动到另一个OrderLineItem
,删除第三个SaveChanges()
,修改第四个的数量,然后{{1}}。 Breeze甚至支持使用localStorage完全与服务器断开连接。重新连接后,可以保存所有更改。
REST旨在对one resource at a time进行操作。必须立即对服务器执行每个C / U / D操作,以便可以对响应代码执行操作。它适用于具有简单更新需求的应用程序,但不适用于数据输入应用程序。虽然transactions can be supported in REST,但它们充其量是繁琐的。
话虽如此,您的服务器端Breeze API不仅限于您在Todos示例中看到的内容。 Breeze支持Named Saves,它允许您为不同的操作使用不同的端点。您还可以使用Save Interception来确保您的保存包仅包含它应该包含的类型。当然,没有什么可以阻止您在服务器上公开这两个API,并且两个API都由相同的持久层提供。
如果您必须在它们之间做出决定,则应该从您的用户开始。真正的用户(不是开发人员)不关心REST,他们关心应用程序可以做什么。最终,REST为您的应用程序提供了HTTP的所有语义,Breeze为其提供了关系数据库或对象数据库的所有语义。向用户公开哪一个应取决于您需要支持的用例。