Befehlskette implementieren

Abgeschlossen

Die Befehlskette ist eine Funktionalität für Klassenerweiterungen. Sie können damit in der Basisklasse definierte Methoden mit X++-Code umschließen. Mit Befehlsketten können Sie Standardklassen ohne Verwendung von Ereignishandlern anpassen. Die Funktion ermöglicht Ihnen, benutzerdefinierte Logik hinzufügen, die vor und/oder nach dem Standardcode ausgeführt wird. Nur die Logik von öffentlichen und geschützten Methoden ist erweiterbar. Wenn Sie eine Methode umschließen, können Sie auch auf die geschützten Methoden, öffentlichen Methoden und Variablen der Basisklasse zugreifen. Es ist wichtig, dieses Konzept zu verstehen, da der Basiscode während der Entwicklung von Dynamics 365-Finanz‑ und Betriebs-Apps nicht geändert werden kann.

Um Befehlsketten verwenden zu können, erstellen Sie eine neue Klasse mit demselben Namen wie die Klasse, deren Namen Sie mit _Extension als Suffix erweitern. Die Klassendeklaration muss auch das letzte Schlüsselwort verwenden, um anzuzeigen, dass keine weitere Vererbung möglich ist. Verwenden Sie zum Deklarieren der Klasse außerdem das Attribut ExtensionOf. Sie können dann die Methodendeklaration der Basisklasse in der erweiterten Klasse wiederverwenden. Innerhalb der erweiterten Methode können Sie Ihren benutzerdefinierten Code hinzufügen. Zum Erstellen einer Befehlskette müssen Sie das nächste Schlüsselwort verwenden. Der nächste Befehl ruft die nächste Methode in der Befehlskette auf. Nach der letzten Methode in der Kette wird die ursprüngliche (erweiterte) Methode aufgerufen.

Beispiel

Das folgende Codebeispiel zeigt, wie die Klasse für die Verwendung einer Befehlskette deklariert werden muss. Bei Aufruf der Methode ExampleClass.doSomething() führt der Code zuerst den gesamten Code vor dem nächsten Schlüsselwort aus. Dann wird der Originalcode der Methode ExampleClass.doSomething() ausgeführt. Schließlich wird der gesamte Code nach dem nächsten Schlüsselwort ausgeführt.

[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;
   }
}

Bestimmte Methoden können nicht mit einer Befehlskette umschlossen werden. Wenn die Methode ein auf „false“ gesetztes buchbares oder umschließbares Attribut ([Hookable(false)] bzw. [Wrappable(false)]) verwendet, kann die Methode nicht umschlossen werden. Methoden, die das letzte Schlüsselwort verwenden, können nicht in einer Erweiterungsklasse umschlossen werden. Auch private Methoden sind nicht erweiterbar.