breezeJS:什么是资源?有多种资源吗?

breezeJS: what is a resource? are there multiple kinds of resources?

我正在尝试将 breezeJS 库添加到我的 Angular 项目中。我对 breeze 的资源感到困惑:

查看 API 我看到 MetaDataStore 有一个方法 getEntityTypeNameForResourceName 我假设 returns 来自 "resource name" 的正确实体类型名称我认为这是一个可以给实体的昵称。我认为它的运行方式类似于:

metaStore.getEntityTypeNameForResourceName('users') // returns USR where USR is the table name in the db

然而,在 API 文档中,我看到 SaveOptions object 在其构造函数中采用了可选的 [resourceName] 参数。我假设这是处理保存的服务 URL 或控制器方法?

这是两种不同的"resources"吗?我的解释是否正确?

提前致谢。

有些相同,有些不同。

查询资源名称

getEntityTypeNameForResourceName('users') 显示与 查询资源名称、'users' 关联的 EntityType 名称。在您的情况下,EntityType 名称是 'USR',我敢打赌这是服务器 class 的名称 以及客户端上的 EntityType .

我不知道您是如何创建元数据的,所以我无法确定 'users' 资源名称是如何产生的。如果您从 EF DbContext 生成元数据,则查询资源名称 'users' 可能与相应 DbSet 的名称相匹配。这就是 Breeze-on-.NET 的假设。

我还猜测您使用类似这样的表达式查询用户:

var query = breeze.EntityQuery.from('users') ...

'users'参数就是我们所说的breeze中的"query resource name"。因为大多数人只提供 "query resource name",我们倾向于只说 "resource name".

从 HTTP 角度来看,相应的 server-side 资源是 breeze dataServiceName 和此 "resource name" 的串联。如果您使用数据服务名称 "api" 创建了 EntityManager,则 HTTP 资源为 ~/api/users.

查询也可以指向缓存。您可以使用

获取缓存中的所有用户
breeze.EntityQuery.from('users').using(manager).executeLocally();

如果你想像这样使用 EntityType 名称从缓存中获取怎么办?

breeze.EntityQuery.from('USR').using(manager).executeLocally(); // fails

那是行不通的,因为您没有说 EntityType 名称也是查询资源名称。您可以通过使用元数据注册它来使其成为备用资源名称。

metaStore.setEntityTypeForResourceName ( 'USR', 'USR'); // resourceName, entityTypeName
metaStore.getEntityTypeNameForResourceName('USR'); // returns 'USR'
breeze.EntityQuery.from('USR').using(manager).executeLocally(); // now it works

这 returns 也缓存了用户:-)

metaStore.setEntityTypeForResourceName ( 'Foo', 'USR' ); // resourceName, entityTypeName
metaStore.getEntityTypeNameForResourceName('Foo'); // returns 'USR'
breeze.EntityQuery.from('Foo').using(manager).executeLocally();

保存资源名称

默认情况下,Breeze EntityManager.saveChanges 方法 POST 将 change-set 负载发送到 dataServiceName + "SaveChanges" 端点(例如 ~/api/SaveChanges

假设您的 server-side 网络 api 控制器接受 POST 对 URL 的请求并实施 breeze "SaveChanges" 协议. breeze-on-.NET EntityContextProvider 公开此方法并观察该协议,大多数人将该方法连接到他们的 breeze 控制器的 SaveChanges 方法。

单词"SaveChanges"是默认保存资源名称。很少有开发人员考虑这一点,他们也不应该考虑这一点,除非他们需要多个端点来保存实体更改。

您可以通过指定备用保存资源名称来建立备用保存端点。例如

var saveOptions = new breeze.SaveOptions({resourceName: 'SpecialSave'});
manager.saveChanges(null, saveOptions); // save all pending changes to ~/api/SpecialSave

在这种情况下,您希望 server-side 网络 api 控制器为您的用例实施具有特殊逻辑的 SpecialSave 方法。

你为什么要这样做?也许您会在服务器上的 SaveChanges 方法中编写保护逻辑以拒绝对用户的更改,将该任务专门委派给此受适当授权规则保护的 SpecialSave 方法。

您可以根据需要编写任意数量的替代保存端点。

总结

显然有两种 breeze 资源名称 - 查询和保存。他们的目的不同。它们的相似之处在于它们导致 EntityManager 将 HTTP 请求发送到 URL,这是 dataServiceName 和资源名称的串联。