Бърз преглед на Dynamics AX 2012 SysOperation Framework
Публикувано: 15 февруари 2025 г. в 22:33:03 ч. 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();
}
И на практика сте готови. Горното очевидно е много прост пример и рамката съдържа множество други опции и възможности, но това служи като бърз преглед, ако имате нужда от освежаване, когато не сте използвали рамката от известно време.