10.01.2019, 17:47 | #1 |
Участник
|
Runbase vs SysOperation
а runbase разве не был проклят с появлением ангела sysoperation?
__________________
Felix nihil admirari |
|
10.01.2019, 18:08 | #2 |
Участник
|
Проклят кем?
Идея sysoperation конечно изначальна была хороша, но никто не стал ее развивать. Т.е. сейчас RunBase это единственный способ писать расширяемые классы(с PU22 даже обещают через CoC). Расширения DataContract недоступны. Плюс иногда нужны доп. возможности, к примеру внутри класса управлять задачами, создавая подзадачи |
|
|
За это сообщение автора поблагодарили: Logger (3), wojzeh (1). |
10.01.2019, 20:30 | #3 |
Участник
|
|
|
11.01.2019, 08:51 | #4 |
Administrator
|
В AX 2012 Runbase был действительно объявлен устаревшим:
https://docs.microsoft.com/en-us/dyn...base-framework Однако в D365FO его исключили из "санкционного списка": https://docs.microsoft.com/en-us/dyn...eprecated-apis И даже наоборот, появилась статья, как расширять наследников RunBase: https://docs.microsoft.com/en-us/dyn...-runbase-class Так что он не только не убран, но и "в расцвете сил". По большому счету в него добавили то, чем был силен SysOperation - а именно запуском в отдельной сессии исполнения бизнес-логики (вспоминаем, как отдельно, не вешая клиента, грузятся SSRS-отчеты в АХ2012). Т.о. теперь в методе main мы вызываем не метод run(), а метод runOperation(), который в свою очередь запускает метод run() либо в отдельной сессии (поведение по умолчанию), либо, если перекрыт метод canRunInNewSession(), который возвращает false - то тогда запускает метод run() в той же сессии.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 11.01.2019 в 08:54. |
|
|
За это сообщение автора поблагодарили: AlGol (2), trud (5), Logger (3), alex55 (1), axotnik88 (1). |
11.01.2019, 18:49 | #5 |
Участник
|
Цитата:
Сообщение от trud
Проклят кем?
Идея sysoperation конечно изначальна была хороша, но никто не стал ее развивать. Т.е. сейчас RunBase это единственный способ писать расширяемые классы(с PU22 даже обещают через CoC). Расширения DataContract недоступны. Плюс иногда нужны доп. возможности, к примеру внутри класса управлять задачами, создавая подзадачи и что, в этой связи в d365 всё переделано взад на runbase?
__________________
Felix nihil admirari |
|
11.01.2019, 19:32 | #6 |
Banned
|
|
|
11.01.2019, 23:41 | #7 |
Участник
|
и опять выпустят фетву против runbase? нам-то чо делать: крестик снимать или...?
__________________
Felix nihil admirari |
|
13.01.2019, 20:28 | #8 |
Участник
|
Мне кажется, подобно тому, как начинающие разработчики в прежних версиях упускали, где (на сервере или на клиенте) в какой момент времени будет выполняться тот или иной метод их наследника RunBase, сейчас дискутирующие упускают то, кто будет писать исходный класс на основе SysOperation или RunBase - и кто потом будет его расширять Наверно, стоит ввести некую классификацию разработчиков в данном контексте:
Цитата:
Цитата:
Рассуждения про выбор между SysOperation и RunBase, как показано выше, существенно зависят от того, в какой роли вы выступаете (SYS/ISV/USR-разработчик) и про чей код говорите: свой или чужой, т.е. от сценария (1-5), в контексте которого идет обсуждение Для USR-разработчиков, по-моему, SysOperation предпочтительнее, потому что позволяет более четко отделить сервис от контракта и UI для интерактивного ввода параметров, что способствует повторному использованию сервисных операций в тех местах, которые изначально не предполагались. Наследников RunBase обычно использовать из стороннего кода менее удобно, потому что там часто не выделен четко контракт (банально не хватает parm-методов), плюс внутри могут быть какие-то неявные завязки на интерактивный запуск, скажем, инициализация по глобальным настройкам и т.п. SysOperation в этом плане как-то больше дисциплинирует что ли. Последний раз редактировалось gl00mie; 13.01.2019 в 20:57. |
|
|
За это сообщение автора поблагодарили: ta_and (4). |
13.01.2019, 21:10 | #9 |
Участник
|
Цитата:
Расширение контракт классов - хорошее прекимущество, особенно когда закроют полностью app suite. А то приходится такой велосипед городить чтобы добавить новые атрибуты в sys operation, просто капец. Не думаю, опять же, что будут хаять опять runBase, если его так прокачали, как описали выше ( новая сессия, что несомненно круто!) |
|
14.01.2019, 10:04 | #10 |
Участник
|
Цитата:
Сообщение от gl00mie
Для USR-разработчиков, по-моему, SysOperation предпочтительнее, потому что позволяет более четко отделить сервис от контракта и UI для интерактивного ввода параметров, что способствует повторному использованию сервисных операций в тех местах, которые изначально не предполагались.
Это на мой взгляд фундаментальный баг, о котором многие забывают(или не знают) Например первая ссылка по запросу Post purchase order through code Ax2012 выдает следующий фрагмент кода(что отлично работало в 2009, когда класс был наследником от RunBase), который может прекратить работать в любом момент - из за того что юзер под которым это запускается может разнести PO из интерфейса со спец. параметрами(типа проверки кредитного лимита) X++: static void postPurchaseOrder(Args _args) { PurchTable purchTable = PurchTable::find(); PurchFormLetter purchFormLetter; purchFormLetter = PurchFormLetter::construct(DocumentStatus::PurchaseOrder); purchFormLetter.update(purchTable, , systemDateGet(), PurchUpdate::All); } |
|
14.01.2019, 12:04 | #11 |
Участник
|
Цитата:
Контракт распаковывает контроллер. Который это делает в методе unpack. Контракт - это такой же класс как и все, просто размеченный атрибутами. |
|
14.01.2019, 13:36 | #12 |
Участник
|
Цитата:
Хотя может это и кривизна конкретной реализации PurchFormLetter, но недавно мы много дней потеряли на поиски этой баги, когда у некоторых пользователей подставлялись старые значения при запуске разноски из кода Я что-то подумал что это баг всего фрамеворка, но возможно стоит еще поизучать вопрос Последний раз редактировалось trud; 14.01.2019 в 13:39. |
|
|
За это сообщение автора поблагодарили: gl00mie (5). |
14.01.2019, 16:29 | #13 |
Участник
|
Я думаю, вот эта фраза
Цитата:
способствует повторному использованию сервисных операций в тех местах, которые изначально не предполагались.
|
|
14.01.2019, 16:41 | #14 |
Участник
|
А как быть с всякими prePromptModifyContract и подобными методами(иногда в них запихивают бизнес логику)? т.е. это будет работать так же как и runBase где вы заполните все parm методы и вызовете run.
|
|
14.01.2019, 17:13 | #15 |
Участник
|
Цитата:
Смысл этого метода чисто в UI. Provides the opportunity to modify the contract before the dialog is shown to the user. Т.е. если он содержит бизнес-логику. То все равно она должна уходить в контракт и это можно сымитировать |
|
14.01.2019, 17:53 | #16 |
Участник
|
Обычно там делают заполнение параметров от query или наоборот - query от параметров. query кстати в датаконтракт не входит, т.е. ее дополнительно нужно будет передавать.
ну т.е. о чем я и писал, когда имел ввиду развитие framework - существует множество подобных мелочей, которые никто особо не правит и которые сводят все преимущества впустую. т.е. кода у вас получится в итоге больше, с еще большим дублированием чем RunBase |
|
14.01.2019, 19:32 | #17 |
Участник
|
|
|
15.01.2019, 01:27 | #18 |
Участник
|
Цитата:
Цитата:
Сообщение от trud
ну да, в контроллере. Для PurchFormLetter это происходит неявно, в методе construct. причем в методе getDataContractObject
Хотя может это и кривизна конкретной реализации PurchFormLetter, но недавно мы много дней потеряли на поиски этой баги, когда у некоторых пользователей подставлялись старые значения при запуске разноски из кода Я, может, как-то не так готовлю SysOperation framework, но при необходимости я не гнушаюсь добавлять в DataContract параметры типа Query. Да, при этом нужно делать дополнительную валидацию контракта на предмет передачи "кривого" Query, в котором отсутствуют ожидаемые DataSource'ы. Да, при этом нужно делать некий метод, создающий "Query по умолчанию" - либо в контракте, либо в сервисе. Да, такой вариант в AX 2012 не подходит для сервисов, вызываемых через AIF по http, потому что там DataContract должен быть вообще без малейшей бизнес-логики и ссылок на посторонние типы и классы (хотя это - скорее "особенности" публикации AIF'ом сервисов на IIS). Но в целом, если нужно создать сервис, принимающий на вход Query и запускаемый пользователем интерактивно, а не извне через http, по-моему, Query вполне себе может быть частью контракта. Или речь про какие-то стандартные контракты, а не "вообще"?.. |
|
15.01.2019, 02:30 | #19 |
Участник
|
Ну мы обсуждаем операции, для которых есть диалог пользователя(обычный режим запуска), плюс возможность эту же операцию запустить из кода. Разве если вы добавите в DataContract parmQuery, этот Query появится в диалоге в интерактивном режиме запуска?
|
|
15.01.2019, 09:08 | #20 |
Участник
|
|
|
Теги |
runbase, sysoperation framework |
|
|