ภาพรวมอย่างรวดเร็วของกรอบงาน SysOperation ของ Dynamics AX 2012
ที่ตีพิมพ์: 15 กุมภาพันธ์ 2025 เวลา 22 นาฬิกา 36 นาที 30 วินาที 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 แต่จะทำงานได้แม้ว่าจะไม่ขยายก็ตาม ข้อดีของการขยายซูเปอร์คลาสคือให้ข้อมูลเซสชันบางอย่างที่อาจมีประโยชน์
class MyDataContract extends SysOperationDataContractBase
{
ItemId itemId;
}
ในตัวอย่างนี้ itemId เป็นสมาชิกข้อมูล คุณต้องใช้เมธอด parm สำหรับสมาชิกข้อมูลแต่ละรายการและแท็กด้วย DataMemberAttribute เพื่อให้เฟรมเวิร์กทราบว่าข้อมูลนั้นคืออะไร การดำเนินการนี้จะทำให้เฟรมเวิร์กสร้างกล่องโต้ตอบให้คุณโดยอัตโนมัติ
public ItemId parmItemId(ItemId _itemId = itemId)
{
;
itemId = _itemId;
return itemId;
}
บริการ
คลาสบริการคือคลาสที่ประกอบด้วยตรรกะทางธุรกิจจริง ไม่เกี่ยวข้องกับการแสดงกล่องโต้ตอบ การประมวลผลแบบแบตช์ หรืออะไรก็ตามในทำนองนั้น นั่นเป็นความรับผิดชอบของคลาสคอนโทรลเลอร์ การแยกส่วนเหล่านี้ออกจากกันจะช่วยให้คุณออกแบบโค้ดได้ดีขึ้นและสร้างโค้ดที่นำกลับมาใช้ใหม่ได้มากขึ้น
เช่นเดียวกับคลาสสัญญาข้อมูล คลาสบริการไม่จำเป็นต้องสืบทอดจากสิ่งใดโดยเฉพาะ แต่ควรสืบทอดจากคลาส SysOperationServiceBase อย่างน้อยถ้าคุณคาดหวังว่าบริการจะถูกเรียกใช้เป็นงานแบตช์ เนื่องจากซูเปอร์คลาสให้ข้อมูลบางอย่างเกี่ยวกับบริบทแบตช์ วิธีที่เริ่มการดำเนินการ (เช่น เรียกใช้ตรรกะทางธุรกิจ) ต้องใช้อ็อบเจ็กต์ของคลาสสัญญาข้อมูลของคุณเป็นอินพุต และควรตกแต่งด้วย [SysEntryPointAttribute] ตัวอย่างเช่น:
{
}
โดยใช้วิธีการที่เรียกว่า run:
public void run(MyDataContract _dataContract)
{
// run business logic here
}
ผู้ควบคุม
คลาสคอนโทรลเลอร์จะจัดการการดำเนินการและการประมวลผลแบบแบตช์ของการดำเนินการของคุณ นอกจากนี้ยังช่วยให้แน่ใจว่าโค้ดจะถูกดำเนินการใน CIL เพื่อประสิทธิภาพสูงสุด คลาสคอนโทรลเลอร์โดยทั่วไปจะสืบทอดมาจากคลาส SysOperationServiceController แม้ว่าจะมีตัวเลือกอื่นๆ เช่นกัน
{
}
ตัวสร้างของซูเปอร์คลาสใช้ชื่อคลาส ชื่อเมธอด และ (ทางเลือก) โหมดการทำงานเป็นพารามิเตอร์ ชื่อคลาสและเมธอดควรเป็นชื่อของคลาสบริการของคุณและเมธอดที่ควรรันบนคลาสนั้น ดังนั้น คุณอาจใช้เมธอดคอนสตรัคของตัวควบคุมของคุณดังนี้:
{
;
return new MyController(classStr(MyService),
methodStr(MyService, run));
}
จากนั้นวิธีหลักของคลาส MyController ก็สามารถทำได้ง่ายเพียง
{
;
MyController::construct().startOperation();
}
และคุณก็ทำเสร็จเรียบร้อยแล้ว ตัวอย่างด้านบนเป็นเพียงตัวอย่างง่ายๆ และกรอบงานนี้ยังมีตัวเลือกและความเป็นไปได้อื่นๆ อีกมากมาย แต่ข้อมูลนี้เป็นเพียงภาพรวมคร่าวๆ หากคุณต้องการทบทวนเมื่อไม่ได้ใช้กรอบงานนี้มาระยะหนึ่ง