在一个规模稍大的 SAP S/4HANA 项目里,CDS 数据模型很快就会遇到一种特别熟悉的现象。销售订单有金额、币种、创建信息和一些派生字段,采购订单也有类似结构,交货单、发票、库存对象甚至主数据对象里,又会出现一批语义相同或者计算方式相同的元素。
如果只是两个 CDS View,复制几行代码似乎没有什么问题。但当同一套字段定义、计算逻辑和 Annotation 分散到几十个 CDS View Entity、Projection View 甚至不同业务领域之后,问题就出现了。
一处字段类型发生调整,需要检查很多 CDS 对象。一处计算公式修正,开发人员需要确认其他地方是不是也复制过同样的表达式。一项语义 Annotation 发生变化,又可能出现不同业务模型表达不一致的问题。
CDS Aspect 正是为这种建模问题而设计的。
SAP 官方对 CDS Aspect 的定位非常清楚。Aspect 的思想借鉴了 Aspect-Oriented Programming,也就是 AOP 中对横切关注点进行抽离的设计思路。在 CDS 数据建模里,可重复使用的字段、计算以及相关 Metadata 可以集中定义在 Aspect 中,再由多个 CDS Entity 重复使用。SAP 特别强调了single source of truth,也就是让同一业务语义只有一个中心定义,而不是在多个模型中分别维护。
这里讨论的并不是 Java Spring AOP 那种运行时方法拦截,也不是 ABAP 里的某种动态增强机制。CDS Aspect 更接近一种模型级的可复用构件。它解决的是 CDS Model 内部的结构复用与语义复用问题。
把它放到今天 SAP 强调的 Cl