公开非规范化视图

Objective

After completing this lesson, you will be able to 使用非规范化的视图定义针对特定用例量身定制的服务

路径表达式

到目前为止,在我们的场景中实施的 AdminService 以 1:1 的方式公开基础数据模型。这类服务相当罕见。相反,服务通常会公开针对特定用例定制的非规范化视图。让我们看一下以下示例。

我们对 CatalogService 进行建模,该服务公开域模型中的书籍和作者以在 bookstore 应用程序中使用。换句话说,此服务旨在使目录用户可以访问书及其作者并下订单。

我们现在创建的新服务也在 CAP 项目的 srv 文件夹中定义。为此,我们使用 cat-service.cds 文件(请参阅下图)。

首先,我们以与 AdminService 相同的方式进行操作:我们从文件 db/schema.cds 中导入命名空间前缀为 com.sap.learning 的所有定义,并为导入的定义设置本地别名 db(第 1 行)。

然后,行 3 到 31 包含一个 service 块,该块将名为 CatalogService 的服务接口定义为公开实体的集合。@path 注释用于指定将在其下访问服务的 URL 路径 /cat

CatalogService 公开两个实体,这两个实体在基础域模型中的实体上定义为投影。行 5ff 声明一个名为 Books 的实体,即导入域模型中定义的 Books 实体上的视图。相应地,作者实体在第 18ff 行中声明为域模型中作者实体的投影。

稍后,我们将详细查看 CatalogService 中的作者实体。首先,我们来详细了解一下工作簿实体。

以 1:1 方式公开基础域实体的 AdminService 中的 Books 实体不同,CatalogService 中的 Books 实体使用显式 select 子句。这意味着只公开 select 子句中显式列出的内容。

在 select 子句中,可以使用所谓的路径表达式沿着关联和/或结构化元素导航。

在所示示例中,工作簿模型实体的作者关联用于访问作者姓名,并将其作为作者包含在 select 子句中。

此外,pubCountry 是在工作簿模型实体上定义的关联。它用于将工作簿实体与 sap.common.Countries 代码列表相关联。在此示例中,此代码列表中的国家/地区名称包含在 select 子句中,作为 publCountry

工作簿域实体的价格元素具有结构化类型。此类型的两个组件金额和货币也通过相应的路径表达式包含在 select 子句中。

智能选择器和排除条款

现在,让我们看一下通过 CatalogService 公开的第二个实体。CatalogService 中的 作者 实体是对导入的域模型中的 作者 实体的映射。 

在 select 子句中将 excluding 子句与智能 * 选择器结合使用,除排除列表中列出的元素外,作者域实体的所有元素都将包括在投影中。

作者模型实体具有时代关联,作者实体通过该关联与 Epochs 代码列表相关联。此代码列表中的纪元名称作为附加元素包含在投影中,其名称期间使用路径表达式。

演示和练习:基于非标准化视图定义服务

注意

在练习中,在 SAP Business Application Studio 中自行执行以下演示中的分步说明。

作为练习的起点,如果已成功完成,请使用上一练习添加乐观并发控制的结果。或者,您还可以使用以下 GitHub 资源库中的分支 9_concurrency_control 作为起点:

https://github.com/SAP-samples/cap-development-learning-journey

可在 GitHub 资源库的 10_denormalized_views 分支中找到模拟的完整实施。

有关资源库内容及其使用方法的详细信息,可在此处找到。

观看视频,了解如何基于非规范化视图定义服务。