コマンド チェーンを実装する
コマンド チェーン (CoC) は、クラス拡張機能の機能です。 CoC を使用して、基本クラスで定義されているメソッドの前後に X++ コードをラップできます。 CoC を使用すると、イベント ハンドラーを使用せずに、標準クラスをカスタマイズできます。 この機能を使用すると、標準コードの実行前または実行後に実行されるカスタム ロジックを追加できます。 拡張できるのは、public メソッドと protected メソッドのロジックだけです。 メソッドをラップするときは、基本クラスの protected メソッド、public メソッド、および変数にもアクセスできます。 Dynamics 365 財務と運用アプリの開発ではベース コードを変更できないため、この概念を理解することが重要です。
CoC を使用するには、拡張するクラスの名前に接尾語として _Extension を追加することで、新しいクラスを作成する必要があります。 クラスの宣言では、final キーワードを使用して、それ以上継承できないことを示す必要もあります。
最後に、クラスを宣言するときに、ExtensionOf 属性を使用する必要があります。 その後、基本クラスと同じメソッド宣言を拡張クラスで再利用できます。 拡張メソッド内には、カスタム コードを追加できます。 CoC を作成するには、next キーワードを使用する必要があります。 next コマンドでは、コマンド チェーンの次のメソッドが呼び出されます。 チェーンにそれ以上メソッドが存在しない場合は、元の (つまり、拡張された) メソッドが呼び出されます。
例
次のコード例では、CoC を使用するためにクラスを宣言する方法を示します。 ExampleClass.doSomething() メソッドが呼び出されると、まず、next キーワードの前にあるすべてのコードが実行されます。 その後、ExampleClass.doSomething() メソッドの元のコードが実行されます。 最後に、next キーワードの後にあるすべてのコードが実行されます。
[ExtensionOf(classStr(ExampleClass))]
final class ExampleClass_Extension
{
str doSomething(int arg)
{
// Custom logic before standard code.
var s = next doSomething(arg);
// Custom logic after standard code.
return s;
}
}
一部のメソッドは、CoC を使用してラップすることはできません。 メソッドで false に設定されたフック可能属性 [Hookable(false)] または false に設定されたラップ可能属性 [Wrappable(false)] が使用されている場合、メソッドをラップすることはできません。
final キーワードが使用されているメソッドを拡張クラス内にラップすることはできません。 プライベート メソッドも拡張性から除外されます。