Dynamics 365 F&O – Class Extension & Chain of Command

AX 2012’den D365 F&O’a geçiş ile birlikte önceki sürümlerde kullandığımız OverLayering yöntemi devre dışı kaldı. Artık geliştirme yapmak istersek yeni gelen extensibility framework‘ün bize sağladığı araçları kullanmamız gerekiyor. Bu yazıda Dynamics 365 Finance and Operations ile yeni tanıştığımız class extension ve chain of command kavramlarından bahsedeceğim. Ayrıca bu konu bağlantılı, event kullanımını anlattığım yazıma buradan ulaşabilirsiniz.

Class Extension Kullanımı

Örnek Senaryo

Örneğin TrvExpTable üzerinde validateSubmit isminde bir method var. Bu method, TrvExpTable kaydını workflow’a gönderirken çalışıyor. Bu method true dönüş yaparsa kaydı workflow’a gönderebiliyorsunuz. Sizden de bu method’a ek bir kontrol yazmanız isteniyor. Burada class extension yöntemini kullanarak, method’un dönüşüne müdahale edebilirsiniz.

Adımlar

TrvExpTable_Extension isminde yeni bir sınıf yaratın. Burada sınıfın adının _Extension ifadesi ile bitmesi gerekmektedir.

Sınıfın başına final ifadesini eklemeli ve ExtensionOf attribute’unu dahil etmelisiniz. Yani sınıfın imzası aşağıdaki gibi olmalı.

[ExtensionOf(tableStr(TrvExpTable))]
final public class TrvExpTable_Extension
{
}

Ardından aşağıdaki gibi müdahale etmek istediğiniz method’un imzasını sınıfa dahil etmelisiniz. Bu kodu build ettiğinizde değişiklikler aktif olacaktır.

[ExtensionOf(tableStr(TrvExpTable))]
final public class TrvExpTable_DmrTrv_Extension
{
    public boolean validateSubmit()
    {
        boolean ret = next validateSubmit();
        
        ret = ret && GvnUtil::validSubmitExpTable(this);

        return ret;
    }
}

Kodu Analiz Edelim

Next ifadesi Chain of Command (CoC) design pattern’inin bir parçası. Yukarıdaki kodda yer alan next ifadesi ile önce orjinal kodun çalışmasını sağlıyorum. Bu bir nevi super ifadesine karşılık geliyor.

Sonrasında kendi custom kontrolümü çalıştırıyorum. Böylece standart method’un dönüşüne müdahale etmiş oluyorum. İstersem next ifadesinin öncesine de kodumu yazabilirim. Burada önemli nokta, next ifadesini method içinde mutlaka kullanmak zorundayız.

Kodun Çalışma Sırası

Artık TrvExpTable.validateSubmit method’u tetiklendiği zaman

  • D365 F&O validateSubmit method’u için oluşturulan tüm extension sınıflarını tarar.
  • Next öncesine yazılmış olanlar var ise rastgele çalıştırır.
  • Orjinal kodunu çalıştırır.
  • Next sonrasına yazılmış olanlar var ise rastgele çalıştırır. TrvExpTable_Extension sınıfı içinde yazdığımız kodda bu aşamada çalışır.

Çeşitli Örnekler

Yukarıdaki örnekte class extension’ı tablo için kullandık. İstersek Class, View, DataEntity, FormDataSource, FormDataSource Field ve Form Control’ü içinde kullanabiliriz. Aşağıda syntax’ı daha iyi kavrayabilmeniz için birkaç örnek kod bırakıyorum. Daha detaylı örneklere buradan ulaşabilirsiniz.

Class

[ExtensionOf(classStr(TrvExpenseLinesVisibilityController))]
final class TrvExpenseLinesVisibilityController_Gvn_Extension
{
    public void setGridVisibility()
    {
        next setGridVisibility();

        trvExpenseForm.dataSource(identifierStr(TrvExpTrans)).object(fieldNum(TrvExpTrans, ReceiptNumber)).visible(true);
        trvExpenseForm.dataSource(identifierStr(TrvExpTrans)).object(fieldNum(TrvExpTrans, Description)).visible(true);
    }
}

FormDataSource

[ExtensionOf(formDataSourceStr(TrvExpenses, TrvExpTrans))]
final public class TrvExpTransDS_Gvn_Extension
{
    public void write()
    {
        next write();
        
        FormDataSource formDs = element.dataSource(formDataSourceStr(TrvExpenses, TrvExpTable));
        formDs.reread();
    }
}

Önemli Notlar

  • Sadece public ve protected methodlar da class extension yöntemini kullanabilirsiniz. Private methodlar için kullanılamaz.
  • Bu yöntemde eventlerden farklı olarak this ifadesini kullanabiliyoruz.
  • Next ifadesini if, whiledo-while, for ifadeleri ile beraber kullanamazsınız.
  • Burada yazdığımız kodlar, eventlerden önce tetiklenir.
    • Örneğin bir tablonun insert method’u için class extension oluşturalım. Aynı şekilde OnInserted event’inede kod yazalım. Önce class extension sonra event çalışır.
  • Display method tanımlamak için de class extension kullanılır.
  • Extension sınıfı içine yazdığımız custom methodlara tableName.methodName notasyonu ile ulaşabilirsiniz.
  • Bu konuda bilinen kısıtlamalara ve daha detay okumaya buradan ve şuradan ulaşabilirsiniz.

Son olarak

Class extension ile ilgili bahsedeceklerim bu kadardı. Diğer D365 F&O yazılarıma buradan, Dynamics AX yazılarıma da şuradan bakabilirsiniz. Hoşçakalın.

Yazıyı Paylaş

“Dynamics 365 F&O – Class Extension & Chain of Command” hakkında 2 yorum

  1. Geri bildirim: Dynamics 365 F&O – Events | Güven Şahin

Semih için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir