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

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

本文关键字:资源 breezeJS 什么      更新时间:2023-09-26

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

查看API,我看到MetaDataStore有一个方法getEntityTypeNameForResourceName,我假设从"资源名称"返回一个适当的实体类型名称,我假设这是一个可以给实体的昵称。我认为它的操作类似于:

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

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

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

有点相同,有点不同。

查询资源名称

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

我不知道你是如何创建元数据的,所以我不能确定'users'资源名是如何产生的。如果您从EF DbContext生成元数据,那么查询资源名'users'很可能与相应的DbSet的名称匹配。这就是微风。净假设。

我猜你也用这样的表达式来查询用户:

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

'users'参数就是我们在breeze中所说的"查询资源名"。因为大多数人只提供"查询资源名称",所以我们倾向于直接说"资源名称"。

从HTTP的角度来看,对应的服务器端资源是微风dataServiceName和这个"资源名"的连接。如果您使用dataServiceName "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

这也返回缓存的用户:-)

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

保存资源名称

默认情况下,Breeze EntityManager.saveChanges方法将变更集有效负载发送到dataServiceName + "SaveChanges"端点(例如~/api/SaveChanges)

假设你的服务器端web api控制器接受POST请求到那个URL,并实现轻松的"SaveChanges"协议。走在-。. NET EntityContextProvider公开了这个方法,并观察到协议和大多数人将该方法连接到他们的微风控制器的SaveChanges方法。

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

您可以通过指定另一个保存资源名来建立另一个保存端点。例如

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

在这种情况下,你期望你的服务器端web api控制器实现一个SpecialSave方法与特殊的逻辑为您的用例。

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

您可以根据需要编写任意多的这些可选保存端点。

总结

显然有两种微风资源名称-查询和保存。他们的目的不同。它们的相似之处在于它们使EntityManager将HTTP请求发送到一个URL,该URL是dataServiceName和资源名称的连接。