Dynamics AX 2012 дээр аль дэд анги үүсгэхийг мэдэхийн тулд SysExtension Framework-ийг ашиглах
Нийтэлсэн: 2025 оны гуравдугаар сарын 19 21:25:34 (UTC)
Энэ нийтлэл нь Dynamics AX 2012 болон Dynamics 365 for Operations дээрх бага мэддэг SysExtension хүрээг ашиглан шинж чанарын чимэглэл дээр тулгуурлан дэд ангиудыг үүсгэхийн тулд боловсруулалтын ангийн шатлалын хялбархан өргөтгөх боломжтой дизайныг хэрхэн ашиглах талаар тайлбарласан болно.
Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012
Энэхүү нийтлэлд өгсөн мэдээлэл нь Dynamics AX 2012 R3 дээр үндэслэсэн байна. Энэ нь бусад хувилбаруудад хүчинтэй эсвэл хүчинтэй байж болох юм. (Шинэчлэлт: Би энэхүү нийтлэлд өгсөн мэдээлэл нь мөн Dynamics 365 for Operations-д хүчинтэй гэдгийг баталж чадна)
Dynamics AX-д боловсруулах ангийг хэрэгжүүлэхэд, ихэвчлэн та ангийн шаталсан бүтэц үүсгэх шаардлагатай болдог бөгөөд тус бүрийн дэд ангийг enum утга эсвэл бусад өгөгдлийн холболттой холбох шаардлагатай. Классик дизайн нь супер ангид байгуулах аргатай байх бөгөөд энэ нь орж ирсэн өгөгдлийн үндсэн дээр ямар ангийг үүсгэхийг тодорхойлсон switch ашигладаг.
Үүний үндсэн дээр энэ нь сайн ажилладаг ч, хэрэв олон янзын оролттой (enum-ийн олон элемент эсвэл оролт нь хэд хэдэн өөр утга холилдсон байвал) бол хадгалахад төвөгтэй болон алдаатай болдог бөгөөд дизайн нь үргэлж тиймээс шинэ дэд анги нэмэх эсвэл оролтод үндэслэн аль дэд ангийг ашиглах шаардлагатай бол бол супер ангийн энэ байгуулах аргыг өөрчлөх шаардлагатай болно гэдгээр сул талтай байдаг.
Азтай нь, үүнийг хийх илүү гоё, гэхдээ харамсалтай нь бага мэдэгддэг арга бий, үүнд SysExtension хүрээ хэрэглэх явдал юм.
Энэ хүрээ нь танд дэд ангийг чимэглэхэд хэрэглэж болох атрибутуудыг ашигладаг бөгөөд ингэснээр систем нь ямар дэд ангийг ямар үйлдлийг гүйцэтгэхийн тулд ашиглахыг олж мэдэх боломжтой болно. Та одоо ч байгуулах арга хэрэглэх шаардлагатай бөгөөд зөв хийвэл шинэ дэд ангийг нэмэх үед үүнийг хэзээ ч өөрчлөх шаардлагагүй болно.
Одоо бид төсөөлөх жишээг авч үзье. Таны хийх гэж буй зүйл нь InventTrans хүснэгт дээр үндэслэн ямар нэгэн боловсруулах үйлдлийг хэрэгжүүлэх гэж байна. Ямар боловсруулах үйлдэл хийх нь бичиг баримт нь StatusReceipt болон StatusIssue утгууд болон тэдгээр нь SalesLine, PurchLine эсвэл аль нэгтэй нь холбоотой эсэхээс хамаарна. Одоо та олон янзын холимогуудтай байгаа тул энэ нь илэрхий байна.
Тэгвэл бид одоогоор зөвхөн хэд хэдэн холимогыг боловсруулах шаардлагатай гэдгээ мэдэж байгаа боловч цаашид олон олон холимогийг боловсруулахыг хүсэх болно гэдгээ мэдэж байна.
Тиймээс үүнийг харьцангуй энгийн байлгахын тулд бид одоогоор зөвхөн SalesLine-тай холбоотой StatusIssue утга ReservPhysical эсвэл ReservOrdered-тай бичиг баримтуудыг боловсруулах шаардлагатай гэж үзье, бусад бүх холимогийг одоогоор орхих боломжтой, гэхдээ та мэдэж байгаа учраас дараа нь эдгээрийг боловсруулах шаардлагатай болно гэдгээр кодоо өргөжүүлж болохуйц байдлаар зохион бүтээх хэрэгтэй.
Таны шаталсан бүтэц одоогоор дараах байдлаар харагдаж болно:
- MyProcessor
- MyProcessor_Sales
- MyProcessor_Sales_ReservOrdered
- MyProcessor_Sales_ReservPhysical
- MyProcessor_Sales
Одоо, та супер ангид ModuleInventPurchSales болон StatusIssue enum дээр үндэслэн дэд ангийг үүсгэдэг арга хэрэгжүүлж болох юм. Гэвч та шинэ дэд ангийг нэмэх бүрт супер ангийг өөрчлөх шаардлагатай болно, энэ нь обьект хандалтын програмчлалын наследство (inheritance)-ийн санаа биш юм. Эцсийн эцэст, та RunBaseBatch эсвэл SysOperationServiceBase-г шинэ батч ажлын байр нэмэх бүртээ өөрчлөх шаардлагагүй.
Үүний оронд, та SysExtension хүрээг ашиглаж болно. Энэ нь танд SysAttribute-ийг өргөжүүлэх шаардлагатай нэг дэд ангийг нэмэх шаардлагатай бөгөөд энэ нь таны боловсруулах ангийг чимэглэхэд ашиглагдах атрибут байх болно.
Энэ анги нь SysOperation хэрэгжилтэд зориулсан өгөгдлийн гэрээний ангийг хэрхэн хийхтэй төстэй бөгөөд энэ нь зарим өгөгдлийн гишүүд болон тэдгээрийн утгуудыг авах, тохируулах зориулсан параметр аргуудтай байдаг.
Манай тохиолдолд, ClassDeclaration дараах байдлаар харагдах боломжтой:
{
ModuleInventPurchSales module;
StatusIssue statusIssue;
StatusReceipt statusReceipt
}
Та бүх өгөгдлийн гишүүдийг үүсгэхийн тулд шинэ() арга хэрэгжүүлэх хэрэгтэй. Хэрэв та хүсвэл эдгээрийн зарим эсвэл бүхэнд нь урьдчилсан утгууд өгөх боломжтой, гэхдээ би үүнийг хийгээгүй.
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
;
super();
module = _module;
statusIssue = _statusIssue;
statusReceipt = _statusReceipt;
}
Мөн та бүрт өгөгдлийн гишүүн бүрийн хувьд параметр арга хэрэгжүүлэх хэрэгтэй, гэхдээ би тэдгээрийг энд орхиж байгаа учраас та хэрхэн хийхийг мэдэж байгаа гэж бодож байна - эсвэл үүнийг дасгал гэж үзье ;-)
Одоо та атрибут ангийг ашиглан өөрийн боловсруулах ангийг чимэглэх боломжтой. Жишээлбэл, ангийн зарлалууд дараах байдлаар харагдах боломжтой:
StatusIssue::None,
StatusReceipt::None)]
class MyProcessor_Sales extends MyProcessor
{
}
[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
StatusIssue::ReservOrdered,
StatusReceipt::None)]
class MyProcessor_Sales_ReservOrdered extends MyProcessor_Sales
{
}
[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
StatusIssue::ReservPhysical,
StatusReceipt::None)]
class MyProcessor_Sales_ReservPhysical extends MyProcessor_Sales
{
}
Мэдээжийн хэрэг, та ангийг өөрийн хүссэнээр нэрлэж болно, энд чухал зүйл бол та ангийг боловсруулах ямар үйлдэл хийдэгийг тусгах атрибутуудтайгаар чимэглэх явдал юм. (Гэхдээ санах хэрэгтэй зүйл бол Dynamics AX-д ангийн шаталсан бүтцийн нэрийн дүрмүүд байдаг бөгөөд боломжтой бол тэдгээрийг дагаж мөрдөх нь үргэлж сайн санаа юм).
Одоо та ангийг чимэглэснээр ямар үйлдлийг гүйцэтгэдэгийг нь тодорхойлж, SysExtension хүрээг ашиглан дэд ангийг шаардлагатай үед үүсгэх боломжтой болсон.
Таны супер ангид (MyProcessor), та дараах байдлаар байгуулах арга нэмэх боломжтой:
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
MyProcessor ret;
MyProcessorSystemAttribute attribute;
;
attribute = new MyProcessorSystemAttribute( _module,
_statusIssue,
_statusReceipt);
ret = SysExtensionAppClassFactory::getClassFromSysAttribute(classStr(MyProcessor), attribute);
if (!ret)
{
// no class found
// here you could throw an error, instantiate a default
// processor instead, or just do nothing, up to you
}
return ret;
}
Жинхэнэ сонирхолтой хэсэг нь - үнэндээ энэ нийтлэлийн бүх зорилго (тоглоомын утгатай хүлцэл үзүүлж байна) бол SysExtensionAppClassFactory ангид байрлах getClassFromSysAttribute() арга юм. Энэ арга нь юу хийдгийг хэлэхэд, энэ нь домогт ангиудын супер ангийн нэрийг (энэ супер анги нь домогт хамгийн дээд байрлалд байх шаардлагагүй; зөвхөн энэ ангийг өргөтгөсөн ангиуд л эрхтэй гэсэн үг) болон аттрибут объектыг хүлээн авдаг.
Дараа нь энэ нь тодорхой супер ангиа өргөтгөсөн ба холбогдох аттрибут бүхий ангийн объектыг буцаана.
Та үнэхээр шаардлагатай бол туслах арга руу илүү их шалгалт эсвэл логик нэмэх боломжтой, гэхдээ эндээс авсан чухал сургамж нь нэгэнт хэрэгжүүлсэн бол та энэ аргыг дахин өөрчлөх шаардлагагүй болох явдал юм. Та домогт ангиудад дэд ангиудыг нэмэх боломжтой бөгөөд хэрэв та эдгээрийг зохих ёсоор чимэглэсэн бол, туслах арга нь тэднийг олж чадна, яагаад гэвэл бичих үед тэд байсангүй.
Гүйцэтгэл хэр вэ? Би үнэхээр үүнийг шалгахыг оролдож байгаагүй, гэхдээ миний зүүдэндээ энэ магадгүй анхны switch мэдэгдлээс илүү муу гүйцэтгэх болно гэдгийг мэдэрч байна. Гэсэн хэдий ч, Dynamics AX-д хамгийн их гүйцэтгэлийн асуудлыг өгөгдлийн сангийн хандалт үүсгэдэг гэдгийг харгалзан үзвэл, би үүнд санаа зовохгүй байх болно.
Мэдээжийн хэрэг, хэрэв та мянган объект хурдан үүсгэх шаардлагатай зүйл хэрэгжүүлж байгаа бол, илүү их судлах хэрэгтэй байж болно, гэхдээ ердийн тохиолдолд та зөвхөн нэг объектыг үүсгэж, урт хугацааны боловсруулалт хийх үед, энэ нь чухал байхгүй байх болно. Мөн, миний алдаа засах зөвлөмж (дараагийн абзац), SysExtension хүрээ нь кэшлэлтэд тулгуурладаг гэдгийг харгалзан үзвэл, ажиллаж байгаа системд үүний гүйцэтгэлд томоохон нөлөө үзүүлэхгүй гэж бодож байна.
Алдаа засах: Хэрэв туслах арга таны дэд ангийг олохгүй байвал та тэднийг зөв чимэглэсэн гэдгээ итгэлтэй байхад ч, энэ нь кэшлэлттэй холбоотой асуудал байж болох юм. Клиент болон сервер дээр кэшүүдийг цэвэрлэхийг оролдож үзнэ үү. AOS-ыг дахин эхлүүлэх шаардлагагүй байх ёстой, гэхдээ энэ нь эцсийн арга байх боломжтой.