在 RAP 项目里写到define view entity ... as projection on ...时,很容易产生一种错觉,Projection View 好像只是把底层 CDS View Entity 的字段重新挑一遍,留下需要暴露给 OData Service 的部分即可。
真正做过较复杂的 RAP Business Object 之后会发现,事情远没有这么简单。
一个真实的业务对象往往同时面对多种消费场景。销售订单后台维护界面需要展示内部状态、审批信息和技术字段,移动端应用可能只需要订单号、客户、金额和处理状态,合作伙伴 API 又可能要求另一套字段名称、另一套 association 导航关系以及更严格的数据过滤。如果为了每一种消费场景复制一套底层 Business Object,数据模型很快就会失控。
SAP 为此把 Projection Layer 放在 RAP Business Object 与具体 Service 之间。官方文档将 CDS transactional query 定义为一种 CDS projection view,主要用于 RAP 中针对某个具体服务调整数据模型。它可以做 service-specific projection,也允许一定程度的数据模型扁平化,并承载 UI annotation、value help、计算、defaulting 等更贴近消费场景的配置。
这种设计和 Clean Core 的思想其实非常契合。
底层 interface layer 描述稳定的业务语义,projection layer 描述特定应用怎样看待这份业务数据,service definition 与 service binding