04.10.2017, 04:39 | #1 |
Участник
|
D365: passing through public method by means of Pre- and Post-event handlers
Источник: http://alexvoy.blogspot.com/2017/10/...method-by.html
============== Let's say we need to change the logic of a standard public method in terms of Extensions approach in D367 (AX7). The whole idea is basically in saving values provided by XppPrePostArgs parameter in Pre-event handler method in new parameters and then restoring them in Post- one from the latter. pre()>Save standard method() post()>Restore For example, our business scenario is to allow the user to select Default company without selecting a Project while creating a new Purchase requisition. (I added a new parameter to the module) Therefore, we have to change the logic of validateCoexistenceOfProjectAndBuyingLegalEntity method, which is called inside of PurchReqTable.validateWrite(). Standard, it does not allow to have an empty Project once Default company is chosen. First, we create Pre- and Post-event handlers. Then we put them into a new class and add new "by-passing" logic. X++: class PurchReqTableHandler { #define.CompanyInfoDefaultArgName('CompanyInfoDefaultArgName') [PreHandlerFor(tableStr(PurchReqTable), tableMethodStr(PurchReqTable, validateCoexistenceOfProjectAndBuyingLegalEntity))] public static void PurchReqTable_Pre_validateCoexistenceOfProjectAndBuyingLegalEntity(XppPrePostArgs _args) { RefRecId companyInfoDefault; PurchReqTable purchReqTable = _args.getThis(); if(PurchParameters::find().PurchReqAllowCmpInfoDefWithoutProjId) { // if the user opted for setting Company without a project // we have to save it and use after this standard validation process if ( !purchReqTable.ProjId && purchReqTable.CompanyInfoDefault) { companyInfoDefault = purchReqTable.CompanyInfoDefault; purchReqTable.CompanyInfoDefault = 0; } // make it zero to pass through the standard validation _args.setArg(#CompanyInfoDefaultArgName, companyInfoDefault); } } [PostHandlerFor(tableStr(PurchReqTable), tableMethodStr(PurchReqTable, validateCoexistenceOfProjectAndBuyingLegalEntity))] public static void PurchReqTable_Post_validateCoexistenceOfProjectAndBuyingLegalEntity(XppPrePostArgs _args) { boolean ret; RefRecId companyInfoDefault; PurchReqTable purchReqTable = _args.getThis(); if(PurchParameters::find().PurchReqAllowCmpInfoDefWithoutProjId) { ret = _args.getReturnValue(); companyInfoDefault = _args.getArg(#CompanyInfoDefaultArgName); purchReqTable = _args.getThis(); // restore it if (ret && companyInfoDefault && !purchReqTable.CompanyInfoDefault) { purchReqTable.CompanyInfoDefault = companyInfoDefault; } } } } Источник: http://alexvoy.blogspot.com/2017/10/...method-by.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. Последний раз редактировалось mazzy; 04.10.2017 в 14:18. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
04.10.2017, 14:15 | #2 |
Участник
|
На самом деле интересно, молодец Алексей. Не знал, что можно в передаваемый args пихать свои.
Это уже не так нужно с CoC, но все равно занятно. |
|
04.10.2017, 14:34 | #3 |
Участник
|
Цитата:
Но "для примера наш бизнес сценарий должен позволить". Что делаем? а) разбираемся с бизнес логикой и выясняем причину явно записанного в валидаторе условия б) сообщаем постановщику нашей задачи "для примера" о том, что в стандартной бизнес-логике есть вот такое условие валидации, чтобы он скорректировал условия задачи "для примера" в) явно изменяем стандарный валидатор, чтобы все сразу видели что происходит (возможно даже оставляя комментарии в коде) г) добавляем хуки, которые обманывают валидатор, передавая "глобальный" параметр и жестко завязываясь на конкретную реализацию и окружение валидатора. Пфффф! очевидно же - пункт г) Больше! Больше треша! ================================ Ну ведь дохренища же систем с экстеншенами/плагинами/хуками! И для этой дохренищи уже написаны бестпрактисы и рекомендации что можно делать, а что не надо. Последний раз редактировалось mazzy; 04.10.2017 в 14:39. |
|
|
За это сообщение автора поблагодарили: EVGL (-1), wojzeh (1). |
04.10.2017, 14:36 | #4 |
Участник
|
А еще caller() есть.
И в строку параметров можно положить какой-нибудь объект в сериализованном виде. |
|
04.10.2017, 14:52 | #5 |
Banned
|
Напротив, именно при chain of command это особенно и нужно: как убрать участок кода, который вам не нужен? Вся суть extensions заключается в том, что каждое ISV только добавляет функционал, но как тогда избавиться от излишнего? Пример из практики: прямая поставка в intercompany автоматически разносит накладную в двух компаниях, но что если хотим разнести одну позже из-за условий перехода права собственности DAP?
|
|
|
За это сообщение автора поблагодарили: mazzy (2), wojzeh (1). |
04.10.2017, 14:58 | #6 |
Участник
|
Цитата:
выбрать другую систему. ======================== так на рынке существует много форумных движков. для пользователей они различаются в основном внешним видом и почти не различаются по пользовательскому функционалу. почти все современные форумные движки предоставляют extensions в том или ином виде, под тем или иным названием. для программистов форумные движки отличаются именно системой хуков - что и в какой момент можно перехватить, с какой детализацией и с какой степенью удобства. повторюсь: extensions - не изобретение майкрософт. это очень старая технология. грабли хорошо известны. |
|
04.10.2017, 15:26 | #7 |
Участник
|
Цитата:
как бы ты предложил решить подобную задачу?
__________________
Felix nihil admirari |
|
|
За это сообщение автора поблагодарили: EVGL (10), kashperuk (5). |
04.10.2017, 15:36 | #8 |
Участник
|
Цитата:
Продублировать то, что надо от default company (я не знаю функционала) - сделать свое поле которое ведет себя так же только в тех местах когда надо Последний раз редактировалось belugin; 04.10.2017 в 15:41. |
|
04.10.2017, 15:38 | #9 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: wojzeh (1). |
04.10.2017, 15:41 | #10 |
Участник
|
Цитата:
Сообщение от mazzy
Стандартный функционал не разрешает пустой проект при выбранной Default company.
Но "для примера наш бизнес сценарий должен позволить". Что делаем? а) разбираемся с бизнес логикой и выясняем причину явно записанного в валидаторе условия б) сообщаем постановщику нашей задачи "для примера" о том, что в стандартной бизнес-логике есть вот такое условие валидации, чтобы он скорректировал условия задачи "для примера" в) явно изменяем стандарный валидатор, чтобы все сразу видели что происходит (возможно даже оставляя комментарии в коде) г) добавляем хуки, которые обманывают валидатор, передавая "глобальный" параметр и жестко завязываясь на конкретную реализацию и окружение валидатора. Пфффф! очевидно же - пункт г) Больше! Больше треша! ================================ Ну ведь дохренища же систем с экстеншенами/плагинами/хуками! И для этой дохренищи уже написаны бестпрактисы и рекомендации что можно делать, а что не надо. реальность гораздо страшнее нашего воображения! данный бизнес-сценарий - это то, над чем я конкретно сейчас работаю у реального клиента, которому нужно более гибко и мощно управляться со своим проектным производством. теперь по пунктам, которые ты совершенно обоснованно и чётко выделил. а и б сидели на трубе, но быстро оттуда слиняли после общения с клиентом; в - главный камень преткновения, из-за которого собственно весь сыр-бор: работаем только в парадигме расширения (в том числе и сознания, привыкшего делать простые задачи просто, а также времени разработки и бюджета, гыыы) с твоей оценкой пункта "г" (даже с буквой, которую ты ему присвоил) я полностью согласен, так как прекрасно помню речь из "полицейской академии". но это реальное решение реальной задачи для реального бизнеса. ты не представляешь, насколько мне это не нравится, но я ничего лучше придумать не смог. с интересом жду твоих идей. кстати говоря, не понял я, что имел в виду под "передавая "глобальный" параметр и жестко завязываясь на конкретную реализацию и окружение валидатора". этот хук именно что должен быть привязан к одному конкретному случаю, когда он вызывается из формы создания нового запроса на покупку (эту проверку я удалил из кода для облегчения понимания подхода); параметр самый что ни на есть локальный - существует исключительно в args. но это детали, можно их и опустить, так как меня интересует вопрос в более общей постановке: how to f***** survive in extensions? спасибо за обсуждение!
__________________
Felix nihil admirari |
|
04.10.2017, 15:56 | #11 |
Участник
|
Цитата:
это коррелирующие вещи. но согласен что разные. с замечанием согласен. Цитата:
Сообщение от wojzeh
с твоей оценкой пункта "г" (даже с буквой, которую ты ему присвоил) я полностью согласен, так как прекрасно помню речь из "полицейской академии".
да, нумерация сознательная. как и подразумеваемый пятый пункт - PROFIT!!!! Цитата:
но считаю это запредельным говнокодом. и считаю, что система, которая вынуждает программировать в таком стиле, не является хорошо продуманной. и уж точно не привел бы такой код в качестве примера Цитата:
_args.getThis() - возвращает anytype https://msdn.microsoft.com/ru-ru/lib...s.getthis.aspx фиг с ним, что нет каста, фиг с ним что нет проверок. но РЕКОМЕНДОВАТЬ использовать ЭТО для ОБМАНА штатного валидатора?... впрочем, я уже создавал отдельную ветку: Что с логикой у людей на форуме? Вроде программисты. Вроде код и ТЗ должны читать и писать. |
|
04.10.2017, 16:00 | #12 |
Banned
|
По хорошему без возможности полной подмены метода ни о какой нормальности речь быть не может.
СoC и Pre/Post это все компромиссы которые делают хуже. Они полезны, но как дающие наполовину - опасны. Последний раз редактировалось ax_mct; 04.10.2017 в 16:03. |
|
04.10.2017, 16:01 | #13 |
Участник
|
Цитата:
могу сказать одно - навижиноводы давно живут в условиях закрытого кода и в условиях extensions. правда поэтому у них система более продуманная изначально. |
|
04.10.2017, 16:02 | #14 |
Участник
|
это оффтопик и в некотором смысле троллинг. я ж не продажами занимаюсь: что клиент купил, то и ставим. тут нечего обсуждать, мне, по крайней мере.
Цитата:
- подписка на события; - подписка на публичные методы до и после с различными перверсиями и девиациями; - динамическое перекрытие методов form control; что ещё?
__________________
Felix nihil admirari |
|
04.10.2017, 16:08 | #15 |
Участник
|
Цитата:
точно также как понимаю и покупателей систем. вот наглядный пример, как я сам был на месте покупателя Потенциально новая версия форума. Подсмотреть, обсудить. система экстеншенов формного движка - один из криетриев. не самый важный конечно. но ощутимый. Цитата:
Сообщение от wojzeh
технически говоря, это и не технология, а подход, но давай поставим вопрос шире: какие приёмы нам доступны в новой парадигме?
- подписка на события; - подписка на публичные методы до и после с различными перверсиями и девиациями; - динамическое перекрытие методов form control; что ещё? только давай в другой ветке? Как правильно вести разработку в условиях, когда часть кода закрыта от изменения - Sys-слой в аксапте, закрытые codeunit в навике, extensions в MS CRM здесь все-таки тема D365: passing through public method by means of Pre- and Post-event handlers |
|
04.10.2017, 16:14 | #16 |
Участник
|
Цитата:
можешь вкратце набросать бриллиантово-чистый пример? Цитата:
Цитата:
Сообщение от mazzy
впрочем, я уже создавал отдельную ветку:
Что с логикой у людей на форуме? Вроде программисты. Вроде код и ТЗ должны читать и писать. я чувствую, эмоции тебя переполняют - поверь, меня тоже. но прошу, давай отвлечёмся от критики чистого разума и морального закона внутри нас и вернёмся к нашим баранам.
__________________
Felix nihil admirari |
|
|
За это сообщение автора поблагодарили: Link (1). |
04.10.2017, 16:19 | #17 |
Участник
|
Цитата:
Сообщение от mazzy
давай плакать и страдать здесь Клуб анонимных оверлейщиков
да и хрен с ними. зачем нам навик в топике про аксу? перестань увиливать уже!
__________________
Felix nihil admirari |
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
04.10.2017, 16:21 | #18 |
Участник
|
Цитата:
Сообщение от EVGL
Напротив, именно при chain of command это особенно и нужно: как убрать участок кода, который вам не нужен? Вся суть extensions заключается в том, что каждое ISV только добавляет функционал, но как тогда избавиться от излишнего? Пример из практики: прямая поставка в intercompany автоматически разносит накладную в двух компаниях, но что если хотим разнести одну позже из-за условий перехода права собственности DAP?
спасибо
__________________
Felix nihil admirari |
|
04.10.2017, 16:22 | #19 |
Участник
|
Цитата:
Я бы изо всех сил постарался изменить формулировку задачи. Я бы постарался донести последствия силового решения. Если бы мои уговоры не сработали, то практическое решение было бы похоже на то, что приведено в блоге - стиль "сломать через колено". Но мне чертовски не нравится что система вынуждает писать именно так. Мне чертовски не нравится, что через несколько лет придется с последствиями решений, которые были сделаны в таком стиле. А еще больше мне не нравится, систему сейчас делают такой совершенно конкретные люди. И они это делают точно не со зла. Последний раз редактировалось mazzy; 04.10.2017 в 16:24. |
|
04.10.2017, 16:22 | #20 |
Участник
|
|
|
Теги |
chain of command, extensions |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|