Ringkasan Cepat Kerangka Kerja SysOperation Dynamics AX 2012
Diterbitkan: 15 Februari 2025 pukul 22.35.20 UTC
Artikel ini menyediakan ikhtisar cepat (atau lembar contekan) tentang cara mengimplementasikan kelas pemrosesan dan pekerjaan batch dalam kerangka kerja SysOperation di Dynamics AX 2012 dan Dynamics 365 for Operations.
Dynamics AX 2012 SysOperation Framework Quick Overview
Informasi dalam posting ini berdasarkan Dynamics AX 2012 R3. Informasi ini mungkin berlaku atau tidak berlaku untuk versi lain. (Pembaruan: Saya dapat mengonfirmasi bahwa informasi dalam artikel ini juga berlaku untuk Dynamics 365 for Operations)
Tulisan ini hanya dimaksudkan sebagai ikhtisar singkat dan lembar contekan. Jika Anda baru mengenal kerangka kerja SysOperation, saya sangat menyarankan Anda untuk membaca white paper Microsoft tentang topik ini juga. Informasi di sini mungkin berguna jika Anda hanya perlu sedikit penyegaran tentang berbagai kelas yang terlibat dalam pengembangan operasi dengan kerangka kerja ini.
Ada variasinya, tetapi ketika saya menggunakan framework ini, saya biasanya menerapkan tiga kelas:
- Kontrak data (harus memperluas SysOperationDataContractBase)
- Layanan (harus memperluas SysOperationServiceBase)
- Pengendali ( harus memperluas SysOperationServiceController)
Selain itu, saya juga dapat mengimplementasikan kelas UIBuilder ( harus memperluas SysOperationUIBuilder), tetapi itu hanya diperlukan jika dialog karena alasan tertentu harus lebih maju daripada yang dihasilkan kerangka kerja secara otomatis.
Kontrak data
Kontrak data menyimpan anggota data yang dibutuhkan untuk operasi Anda. Kontrak data dapat dibandingkan dengan makro CurrentList yang umum didefinisikan dalam kerangka kerja RunBase, tetapi diimplementasikan sebagai kelas. Kontrak data harus memperluas SysOperationDataContractBase, tetapi akan berfungsi meskipun tidak. Keuntungan memperluas kelas super adalah menyediakan beberapa informasi sesi yang mungkin berguna.
class MyDataContract extends SysOperationDataContractBase
{
ItemId itemId;
}
Dalam contoh ini, itemId adalah anggota data. Anda perlu menerapkan metode parm untuk setiap anggota data dan menandainya dengan DataMemberAttribute sehingga kerangka kerja mengetahui apa itu. Hal ini memungkinkan kerangka kerja untuk secara otomatis membuat dialog untuk Anda.
public ItemId parmItemId(ItemId _itemId = itemId)
{
;
itemId = _itemId;
return itemId;
}
Melayani
Kelas layanan adalah kelas yang berisi logika bisnis yang sebenarnya. Kelas ini tidak terkait dengan menampilkan dialog, pemrosesan batch, atau hal semacam itu – hal itu merupakan tanggung jawab kelas pengontrol. Dengan memisahkannya, Anda cenderung dapat mendesain kode dengan baik dan membuat kode yang lebih dapat digunakan kembali.
Seperti kelas kontrak data, kelas layanan tidak perlu mewarisi dari apa pun secara khusus, tetapi harus mewarisi dari kelas SysOperationServiceBase, setidaknya jika Anda mengharapkan bahwa layanan akan dijalankan sebagai pekerjaan batch, karena kelas super menyediakan beberapa informasi tentang konteks batch. Metode yang memulai operasi (yaitu menjalankan logika bisnis) harus mengambil objek dari kelas kontrak data Anda sebagai input dan harus dihiasi dengan [SysEntryPointAttribute]. Misalnya:
{
}
dengan metode yang disebut run:
public void run(MyDataContract _dataContract)
{
// run business logic here
}
Pengendali
Kelas pengontrol menangani eksekusi dan pemrosesan batch operasi Anda. Kelas ini juga memastikan bahwa kode dieksekusi dalam CIL untuk kinerja maksimum. Kelas pengontrol biasanya mewarisi kelas SysOperationServiceController, meskipun ada opsi lain juga.
{
}
Konstruktor kelas super mengambil nama kelas, nama metode, dan (opsional) mode eksekusi sebagai parameter. Nama kelas dan metode harus merupakan nama kelas layanan Anda dan metode yang harus dijalankan di dalamnya. Jadi, Anda dapat mengimplementasikan metode konstruksi pengontrol seperti ini:
{
;
return new MyController(classStr(MyService),
methodStr(MyService, run));
}
Maka metode utama dari kelas MyController bisa sesederhana
{
;
MyController::construct().startOperation();
}
Dan pada dasarnya Anda sudah selesai. Contoh di atas jelas merupakan contoh yang sangat sederhana dan kerangka kerja tersebut berisi banyak sekali opsi dan kemungkinan lain, tetapi ini berfungsi sebagai ikhtisar singkat jika Anda perlu menyegarkan pemahaman Anda setelah beberapa lama tidak menggunakan kerangka kerja tersebut.