到目前为止,在我们的场景中实施的 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 子句中。

