共通の再利用アスペクトの組み込み

Objective

After completing this lesson, you will be able to cDS の側面を利用して、新しいエレメントによってエンティティ定義を拡張する

アスペクト

エンティティの定義を、いわゆるアスペクトを使用して新しいエレメントで拡張する方法を見ていきましょう。

CDS アスペクトの詳細については、ビデオを視聴してください。

このレッスンでは、extend ディレクティブについて学習します。annotate ディレクティブについては、後で別のレッスンで説明します。

extend 指示

extend ディレクティブを使用すると、以下の図に示すように、既存の定義に拡張項目を追加することができます。

この例では、エレメント someAdditionalFieldAuthors ドメインエンティティに追加されます。これにより、生成されたデータベーステーブルにもこの項目が追加されます。

注記

消費者は常に、マージされた有効なモデルと、完全に透過的な側面に分離して表示されます。

extend ディレクティブを使用すると、アノテーションなどのメタデータを既存の定義に追加したり、既存のメタデータを上書きしたりすることもできます。

タイププロパティは、extend を使用して設定することもできます。たとえば、String 型の既存のエレメントの長さを増やすことができます。

名称付アスペクト

以下の図に示すように、事前定義された側面とともに extend を使用して、同じ拡張を複数のターゲットに適用することができます。

この例は、createdAt および createdBy の 2 つの要素を定義する名前付きアスペクト ManagedObject を示しています。ブックエンティティと作成者エンティティの両方が、この名前付きアスペクトを介してこれらのフィールドによって拡張されます。

注記

構文 aspect ManagedObject は構文 define aspect ManagedObject と同じ効果があります。つまり、define キーワードはオプションです。

指定の拡張には、項目、タイプ、エンティティなど、任意のものを含めることができます。

ショートカット構文として含む

継承型の構文では、インクルードとして名前付きアスペクトを使用することもできます。この構文を使用すると、複数の指定アスペクトで同時に定義を拡張することができます。以下の図では、Authors エンティティが ManagedObject および AnotherAspect という 2 つのアスペクトで拡張されています。

インクルードはシンタクティカル・シュガー。ここに示す例は、次のように extends のシーケンスを使用する場合と同じです。

Code Snippet
1234567
entity Authors {} extend Authors with ManagedObject; extend Authors with AnotherAspect; extend Authors with { key ID : UUID; ... }

共通の再利用アスペクト

CDS には、再利用のために共通のタイプおよびアスペクトを提供する事前構築済モデル @sap/cds/common が用意されています。

すべてのアプリケーションで、 @sap/cds/common で提供される共通のタイプおよび側面を使用することをお奨めします。これにより、実際のビジネスアプリケーションから学んだベストプラクティスを活用することができます。

次のセクションでは、 @sap/cds/commoncuidmanaged の 2 つの側面について詳しく見ていきます。その後、このモデルの CodeList のアスペクト、および Country および Currency のタイプについても説明します。

アスペクト cuid

cuid アスペクトは、標準的で汎用的に一意の一次キーをエンティティ定義に追加できる便利なショートカットです。

注記

サービスプロバイダランタイムでは、サービスプロバイダランタイムによって、UUID 型キー項目に自動生成された UUID が自動的に入力されます。

アスペクト managed

managed アスペクトを使用して、createdAtcreatedBymodifiedAt、および modifiedBy の 4 つの項目をエンティティに追加することができます。これらのフィールドは、データレコードの作成者と更新者、および作成日時を追跡するために使用されます。

この側面を使用することで、関連するレコード関連の管理情報を保存し、コアドメインモデルをクリーンかつ包括的に維持することができます。

項目 createdBy および modifiedBy のデータ型は User です。これは、 @sap/cds/common からの共通の再利用タイプです。

アスペクトで使用されるアノテーション @cds.on.insert および @cds.on.update は、挿入および更新時に汎用ハンドラによって自動的に入力されるエレメントを示します。

これらのアノテーションで使用される疑似変数は、以下のように解決されます。

  • $now は、現在のサーバ時刻 (UTC) に置き換えられます。
  • $user 認証ミドルウェアから受信した現在のユーザの ID です。

注記

フィールド modifiedAt および modifiedBy は、各行が変更されるたびに、つまり、CREATE 操作中に設定されます。

@sap/cds/common のアスペクトの使用

@sap/cds/common モデルのアスペクトを使用できるようにするには、using ディレクティブを使用してアスペクトをインポートする必要があります。たとえば、以下の図では、これは using の ES6 型デコンストラクタバリアントを介して共通の再利用の側面 cuid および managed に対して行われます。

インポートされた 2 つのアスペクトは、例では、対応する項目を使用して作成者エンティティを拡張するためのインクルードとして使用されます。2 つの事前定義された側面がない場合、ネイティブの方法を使用して示されている例と同じ結果を得るために、Authors エンティティの以下の定義が必要になります。

Code Snippet
123456789101112
entity Authors { key ID: UUID; createdAt : Timestamp @cds.on.insert: $now; createdBy : User @cds.on.insert: $user; modifiedAt : Timestamp @cds.on.insert: $now @cds.on.update: $now; modifiedBy : User @cds.on.insert: $user @cds.on.update: $user; name : String(100); dateOfBirth : Date; dateOfDeath : Date; books : Association to many Books on books.author = $self; }

デモと演習:定義済みの側面の使用

注記

演習問題として、SAP Business Application Studio で、以下のデモのステップバイステップの手順を実行します。

演習の開始点として、前の演習問題ドメインモデルへのアソシエーションの追加の結果を使用します (正常に完了している場合)。または、以下の GitHub リポジトリのブランチ 5_associations を開始点として使用することもできます。

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

シミュレーションの完全な実装は、GitHub リポジトリの 6_common_reuse_appends ブランチにあります。

リポジトリのコンテンツとその使用方法の詳細については、ここを参照してください。

事前定義されたアスペクトの使用方法については、ビデオを視聴してください。