Miklix

Ringkasan Cepat Kerangka Kerja SysOperation Dynamics AX 2012

Diterbitkan: 15 Februari 2025 pukul 22.35.20 UTC
Terakhir diperbarui: 12 Januari 2026 pukul 08.38.51 UTC

Artikel ini memberikan gambaran singkat (atau contekan) tentang cara mengimplementasikan kelas pemrosesan dan pekerjaan batch dalam kerangka kerja SysOperation di Dynamics AX 2012 dan Dynamics 365 for Operations.


Halaman ini diterjemahkan oleh mesin dari bahasa Inggris agar dapat diakses oleh sebanyak mungkin orang. Sayangnya, terjemahan mesin belum merupakan teknologi yang sempurna, sehingga kesalahan dapat terjadi. Jika Anda mau, Anda dapat melihat versi bahasa Inggris aslinya di sini:

Dynamics AX 2012 SysOperation Framework Quick Overview

Informasi dalam posting ini didasarkan pada Dynamics AX 2012 R3. Informasi ini mungkin berlaku atau mungkin tidak berlaku untuk versi lain. (Update: Saya dapat mengkonfirmasi bahwa informasi dalam artikel ini juga berlaku untuk Dynamics 365 for Operations)


Postingan ini hanya dimaksudkan sebagai gambaran singkat dan contekan. Jika Anda baru mengenal kerangka kerja SysOperation, saya sangat menyarankan Anda untuk membaca white paper Microsoft tentang subjek ini juga. Informasi di sini mungkin berguna jika Anda hanya perlu penyegaran singkat tentang berbagai kelas yang terlibat dalam mengembangkan operasi dengan kerangka kerja ini.

Ada beberapa variasi, tetapi ketika saya menggunakan kerangka kerja tersebut, saya biasanya mengimplementasikan tiga kelas:

  • Kontrak data (harus memperluas SysOperationDataContractBase)
  • Layanan (harus memperluas SysOperationServiceBase)
  • Pengontrol (harus memperluas SysOperationServiceController)

Selain itu, saya mungkin juga mengimplementasikan kelas UIBuilder (harus memperluas SysOperationUIBuilder), tetapi itu hanya diperlukan jika dialog karena alasan tertentu harus lebih canggih daripada yang dihasilkan secara otomatis oleh framework.


Kontrak data

Kontrak data menyimpan anggota data yang dibutuhkan untuk operasi Anda. Ini dapat dibandingkan dengan makro CurrentList tipikal yang didefinisikan dalam kerangka kerja RunBase, tetapi diimplementasikan sebagai sebuah kelas. Kontrak data harus memperluas SysOperationDataContractBase, tetapi akan tetap berfungsi meskipun tidak. Keuntungan dari memperluas kelas induk adalah menyediakan beberapa informasi sesi yang mungkin berguna.

[DataContractAttribute]
class MyDataContract extends SysOperationDataContractBase
{
    ItemId itemId;
}

Dalam contoh ini, itemId adalah anggota data. Anda perlu mengimplementasikan metode parm untuk setiap anggota data dan menandainya dengan DataMemberAttribute agar kerangka kerja mengetahui apa itu. Ini memungkinkan kerangka kerja untuk secara otomatis membangun dialog untuk Anda.

[DataMemberAttribute]
public ItemId parmItemId(ItemId _itemId = itemId)
{
    ;

    itemId = _itemId;
    return itemId;
}


Melayani

Kelas layanan adalah kelas yang berisi logika bisnis sebenarnya. Kelas ini tidak berkaitan dengan menampilkan dialog, pemrosesan batch, atau hal-hal semacamnya – itu adalah tanggung jawab kelas pengontrol. Dengan memisahkan hal ini, Anda lebih mungkin merancang kode Anda dengan baik dan membuat kode yang lebih dapat digunakan kembali.

Seperti halnya kelas kontrak data, kelas layanan tidak perlu mewarisi dari kelas tertentu, tetapi sebaiknya mewarisi dari kelas SysOperationServiceBase, setidaknya jika Anda mengharapkan layanan tersebut dijalankan sebagai pekerjaan batch, karena kelas induk menyediakan beberapa informasi tentang konteks batch. Metode yang memulai operasi (yaitu menjalankan logika bisnis) harus menerima objek dari kelas kontrak data Anda sebagai input dan harus diberi dekorasi [SysEntryPointAttribute]. Misalnya:

class MyService extends SysOperationServiceBase
{
}

Dengan metode yang disebut run:

[SysEntryPointAttribute]
public void run(MyDataContract _dataContract)
{
    // run business logic here
}


Pengontrol

Kelas controller menangani eksekusi dan pemrosesan batch operasi Anda. Kelas ini juga memastikan bahwa kode dieksekusi di CIL untuk performa maksimal. Kelas controller biasanya mewarisi dari kelas SysOperationServiceController, meskipun ada pilihan lain juga.

class MyController extends SysOperationServiceController
{
}

Konstruktor dari kelas induk menerima nama kelas, nama metode, dan (opsional) mode eksekusi sebagai parameter. Nama kelas dan nama metode harus berupa nama kelas layanan Anda dan metode yang akan dijalankan di dalamnya. Jadi, Anda dapat mengimplementasikan metode konstruktor pengontrol Anda seperti ini:

public static MyController construct()
{
    ;

    return new MyController(classStr(MyService),
    methodStr(MyService, run));
}

Maka metode utama dari kelas MyController bisa sesederhana ini:

public static void main(Args _args)
{
    ;

    MyController::construct().startOperation();
}

Dan pada dasarnya Anda sudah selesai. Contoh di atas jelas sangat sederhana dan kerangka kerja ini berisi banyak pilihan dan kemungkinan lain, tetapi ini berfungsi sebagai gambaran singkat jika Anda perlu menyegarkan kembali pengetahuan Anda setelah lama tidak menggunakan kerangka kerja ini.

Bacaan Lebih Lanjut

Jika Anda menikmati postingan ini, Anda mungkin juga menyukai saran berikut:


Bagikan di BlueskyBagikan di FacebookBagikan di LinkedInBagikan di TumblrBagikan di XBagikan di LinkedInPin di Pinterest

Mikkel Christensen

Tentang Penulis

Mikkel Christensen
Mikkel adalah pencipta dan pemilik miklix.com. Dia memiliki lebih dari 20 tahun pengalaman sebagai pemrogram komputer profesional/pengembang perangkat lunak dan saat ini bekerja penuh waktu di sebuah perusahaan IT besar di Eropa. Ketika tidak menulis blog, ia menghabiskan waktu luangnya untuk beragam minat, hobi, dan kegiatan, yang mungkin sampai batas tertentu tercermin dalam berbagai topik yang dibahas di situs web ini.