Miklix

ภาพรวมอย่างรวดเร็วของกรอบงาน SysOperation ของ Dynamics AX 2012

ที่ตีพิมพ์: 15 กุมภาพันธ์ 2025 เวลา 22 นาฬิกา 36 นาที 30 วินาที UTC
ปรับปรุงล่าสุด : 12 มกราคม 2026 เวลา 8 นาฬิกา 39 นาที 47 วินาที UTC

บทความนี้ให้ภาพรวมโดยย่อ (หรือคู่มือลัด) เกี่ยวกับวิธีการใช้งานคลาสการประมวลผลและงานแบบแบตช์ในเฟรมเวิร์ก SysOperation ใน Dynamics AX 2012 และ Dynamics 365 for Operations


หน้าเพจนี้ได้รับการแปลจากเครื่องคอมพิวเตอร์จากภาษาอังกฤษ เพื่อให้ทุกคนเข้าถึงได้มากที่สุด น่าเสียดายที่การแปลด้วยเครื่องยังไม่ถือเป็นเทคโนโลยีที่สมบูรณ์แบบ จึงอาจเกิดข้อผิดพลาดได้ หากต้องการ คุณสามารถดูเวอร์ชันภาษาอังกฤษต้นฉบับได้ที่นี่:

Dynamics AX 2012 SysOperation Framework Quick Overview

ข้อมูลในโพสต์นี้อ้างอิงจาก Dynamics AX 2012 R3 อาจใช้ได้หรือไม่ก็ได้กับเวอร์ชันอื่นๆ (อัปเดต: ฉันยืนยันได้ว่าข้อมูลในบทความนี้ใช้ได้กับ Dynamics 365 for Operations ด้วยเช่นกัน)


บทความนี้มีจุดประสงค์เพื่อให้ภาพรวมและคู่มือสรุปอย่างรวดเร็ว หากคุณยังใหม่กับเฟรมเวิร์ก SysOperation ผมขอแนะนำอย่างยิ่งให้คุณอ่านเอกสารไวท์เปเปอร์ของ Microsoft เกี่ยวกับเรื่องนี้ด้วย ข้อมูลในที่นี้อาจมีประโยชน์หากคุณต้องการทบทวนคลาสต่างๆ ที่เกี่ยวข้องกับการพัฒนาการทำงานด้วยเฟรมเวิร์กนี้อย่างรวดเร็ว

อาจมีความแตกต่างกันบ้าง แต่โดยทั่วไปแล้ว เมื่อผมใช้เฟรมเวิร์กนี้ ผมจะสร้างคลาสขึ้นมาสามคลาส:

  • สัญญาข้อมูล (ควรขยายจาก SysOperationDataContractBase)
  • บริการ (ควรสืบทอดจาก SysOperationServiceBase)
  • ตัวควบคุม (ต้องสืบทอดจาก SysOperationServiceController)

นอกจากนี้ ผมอาจจะสร้างคลาส UIBuilder ขึ้นมาเอง (ต้องสืบทอดจาก SysOperationUIBuilder) แต่จำเป็นเฉพาะในกรณีที่ไดอะล็อกนั้นต้องมีความซับซ้อนมากกว่าที่เฟรมเวิร์กสร้างขึ้นโดยอัตโนมัติเท่านั้น


สัญญาข้อมูล

สัญญาข้อมูลจะเก็บสมาชิกข้อมูลที่จำเป็นสำหรับการดำเนินการของคุณ สามารถเปรียบเทียบได้กับมาโคร CurrentList ทั่วไปที่กำหนดไว้ในเฟรมเวิร์ก RunBase แต่ถูกนำมาใช้ในรูปแบบของคลาสแทน สัญญาข้อมูลควรสืบทอดจาก SysOperationDataContractBase แต่จะใช้งานได้แม้ว่าจะไม่ได้สืบทอดก็ตาม ข้อดีของการสืบทอดจากคลาสแม่คือจะให้ข้อมูลเซสชันบางอย่างที่อาจมีประโยชน์

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

ในตัวอย่างนี้ itemId เป็นสมาชิกข้อมูล คุณต้องสร้างเมธอด parm สำหรับสมาชิกข้อมูลแต่ละตัวและติดแท็กด้วย DataMemberAttribute เพื่อให้เฟรมเวิร์กทราบว่าเป็นข้อมูลอะไร ซึ่งจะช่วยให้เฟรมเวิร์กสร้างไดอะล็อกให้คุณโดยอัตโนมัติ

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

    itemId = _itemId;
    return itemId;
}


บริการ

คลาสบริการ (Service class) คือคลาสที่บรรจุตรรกะทางธุรกิจที่แท้จริง มันไม่ได้เกี่ยวข้องกับการแสดงกล่องโต้ตอบ การประมวลผลแบบกลุ่ม หรืออะไรทำนองนั้น – นั่นเป็นความรับผิดชอบของคลาสควบคุม (Controller class) การแยกส่วนนี้จะช่วยให้คุณออกแบบโค้ดได้ดีขึ้นและสร้างโค้ดที่นำกลับมาใช้ซ้ำได้มากขึ้น

เช่นเดียวกับคลาส Data Contract คลาส Service ไม่จำเป็นต้องสืบทอดจากคลาสใดโดยเฉพาะ แต่ควรสืบทอดจากคลาส SysOperationServiceBase อย่างน้อยที่สุดหากคุณคาดว่า Service จะทำงานในรูปแบบ Batch Job เนื่องจากคลาสแม่จะให้ข้อมูลบางอย่างเกี่ยวกับบริบทของ Batch เมธอดที่เริ่มต้นการทำงาน (เช่น รันตรรกะทางธุรกิจ) ต้องรับออบเจ็กต์ของคลาส Data Contract ของคุณเป็นอินพุต และควรตกแต่งด้วย [SysEntryPointAttribute] ตัวอย่างเช่น:

class MyService extends SysOperationServiceBase
{
}

โดยใช้เมธอดที่เรียกว่า run:

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


ตัวควบคุม

คลาส Controller ทำหน้าที่จัดการการเรียกใช้งานและการประมวลผลแบบกลุ่มของการดำเนินการของคุณ นอกจากนี้ยังช่วยให้มั่นใจได้ว่าโค้ดจะถูกเรียกใช้งานในรูปแบบ CIL เพื่อประสิทธิภาพสูงสุด โดยทั่วไปแล้วคลาส Controller จะสืบทอดมาจากคลาส SysOperationServiceController แต่ก็มีตัวเลือกอื่นๆ ด้วยเช่นกัน

class MyController extends SysOperationServiceController
{
}

คอนสตรัคเตอร์ของคลาสแม่จะรับชื่อคลาส ชื่อเมธอด และ (เลือกได้) โหมดการทำงานเป็นพารามิเตอร์ โดยชื่อคลาสและชื่อเมธอดควรเป็นชื่อของคลาสบริการของคุณและชื่อของเมธอดที่จะเรียกใช้ ดังนั้น คุณอาจเขียนเมธอด construct ของคอนโทรลเลอร์ของคุณได้ดังนี้:

public static MyController construct()
{
    ;

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

ดังนั้น เมธอดหลักของคลาส MyController จึงสามารถเรียบง่ายได้ดังนี้

public static void main(Args _args)
{
    ;

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

และโดยพื้นฐานแล้วคุณก็ทำเสร็จแล้ว ตัวอย่างข้างต้นเป็นเพียงตัวอย่างง่ายๆ และเฟรมเวิร์กนี้ยังมีตัวเลือกและความเป็นไปได้อื่นๆ อีกมากมาย แต่ตัวอย่างนี้ใช้เป็นภาพรวมอย่างรวดเร็วหากคุณต้องการทบทวนความรู้หลังจากไม่ได้ใช้เฟรมเวิร์กนี้มาสักพัก

อ่านเพิ่มเติม

หากคุณชอบโพสต์นี้ คุณอาจชอบคำแนะนำเหล่านี้ด้วย:


แชร์บนบลูสกายแชร์บนเฟสบุ๊คแชร์บน LinkedInแชร์บน Tumblrแชร์บน Xแชร์บน LinkedInปักหมุดบน Pinterest

มิคเคล คริสเตนเซ่น

เกี่ยวกับผู้เขียน

มิคเคล คริสเตนเซ่น
ไมเคิล คือผู้สร้างและเจ้าของเว็บไซต์ miklix.com เขามีประสบการณ์เป็นโปรแกรมเมอร์/นักพัฒนาซอฟต์แวร์คอมพิวเตอร์มืออาชีพมากว่า 20 ปี และปัจจุบันทำงานเต็มเวลาให้กับบริษัทไอทีขนาดใหญ่แห่งหนึ่งในยุโรป เมื่อไม่ได้เขียนบล็อก เขาจะใช้เวลาว่างไปกับความสนใจ งานอดิเรก และกิจกรรมต่างๆ มากมาย ซึ่งในระดับหนึ่งอาจสะท้อนให้เห็นได้จากหัวข้อต่างๆ มากมายที่กล่าวถึงในเว็บไซต์นี้