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

时间:2015-08-20 16:21:28

标签: javascript breeze

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

查看API我发现HTMLWindow2.execScript有一个方法MetaDataStore我假设从“资源名称”返回一个正确的实体类型名称,我认为这是一个可以给实体的昵称。我认为它的运作方式如下:

getEntityTypeNameForResourceName

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

这两种不同的“资源”是否正确?

提前致谢。

1 个答案:

答案 0 :(得分:1)

排序相同,各种不同。

查询资源名称

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

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

我猜你也在查询表达式如下的用户:

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

'users'参数就是我们在微风中称之为“查询资源名称”的参数。因为大多数人只提供“查询资源名称”,所以我们倾向于说“资源名称”。

HTTP透视图中对应的服务器端资源是breeze 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控制器接受对该URL的POST请求并实现轻微的“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

在这种情况下,您希望服务器端Web api控制器为您的用例实现具有特殊逻辑的SpecialSave方法。

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

您可以根据需要编写尽可能多的备用保存端点。

摘要

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