Implementazione della Catena di comando

Completato

Catena di comando (CoC) è una funzionalità per le estensioni delle classi. È possibile usare CoC per eseguire il wrapping di metodi definiti nella classe base con codice X++. CoC consente di personalizzare le classi standard senza usare gestori di eventi. Questa funzione consente di aggiungere una logica personalizzata che verrà eseguita prima e/o dopo l'esecuzione del codice standard. È solo possibile estendere la logica di metodi pubblici e protetti. Quando si esegue il wrapping di un metodo, è anche possibile accedere ai metodi protetti, ai metodi pubblici e alle variabili della classe base. È importante comprendere questo concetto, poiché il codice di base non può essere modificato nello sviluppo delle app per la finanza e le operazioni Dynamics 365.

Per usare CoC, è necessario creare una nuova classe che usa lo stesso nome della classe che si sta estendendo, con l'aggiunta di _Extension al nome come suffisso. Inoltre, la dichiarazione di classe dovrà usare la parola chiave final per indicare che non può essere ulteriormente ereditata. Infine, l'attributo ExtensionOf deve essere usato quando si dichiara la classe. È possibile riusare la stessa dichiarazione di metodo della classe base nella classe estesa. All'interno del metodo esteso, è possibile aggiungere codice personalizzato. È necessario usare la parola chiave next per creare una CoC. Il comando successivo chiamerà il metodo successivo nella Catena di comando. Quando non sono più presenti metodi nella catena, viene chiamato il metodo originale (ossia, il metodo esteso).

Esempio

L'esempio di codice seguente mostra come deve essere dichiarata la classe per usare CoC. Quando viene chiamato il metodo ExampleClass.doSomething(), viene eseguito per primo tutto il codice prima della parola chiave next. Viene quindi eseguito il codice originale nel metodo ExampleClass.doSomething(). Infine, viene eseguito tutto il codice dopo la parola chiave 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;
   }
}

Alcuni metodi non consentono di eseguire il wrapping usando CoC. Se il metodo usa un attributo hookable impostato su false, [Hookable(false)], o un attributo wrappable impostato su false, [Wrappable(false)], non è possibile eseguire il wrapping del metodo. Non è possibile eseguire il wrapping di metodi che usano la parola chiave final in una classe di estensione. Anche i metodi privati sono esclusi dall'estendibilità.