|
30.05.2017, 22:57 | #1 |
Участник
|
Цитата:
я говорил, что МС мог бы сделать более универсальный механизм, который учитывает инфраструктуру Аксапты. И мог бы насыпать синтаксического сахара. А также привел примеры того, как это делают другие. Цитата:
доведи свою мысль до вызова функцонала класса, пожалуйста. можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные. как ? как дать пользователю пользователю? как проверить права? как обеспечить, чтобы это расширение работало и в пакетных заданиях. для определенности, давай сформулирую условие на старо-программистком: = создать класс-потомок от CustVendAutoSettlement_Cust_RU (см. скриншот) = ovverride метод dialog* = ovverride метод query = новый функционал должен работать как в пакетном задании, так и при непосредственном запуске пользователем = новый функционал должен быть доступен только некоторым пользователям (желательно, чтобы система доступа была построена на стандартных правах аксапты) ============= говоришь, кто-то указал, что это final класс? ничего-ничего, на проекте можно [было] убрать это слово. давай будем считать, что этого слова там нет. ============= И какое же на твой взгляд? А какое предназначение было у конструкторов, которых не будет? Макс, легко. Обещаю, я сделаю это, после того, как ты покажешь как решить типовую задачу на типовом внедрении - как предоставить пользователю возможность запуска расширенного функционала тривиального семейства из 7-8 классов "просто пометив атрибутом". Последний раз редактировалось mazzy; 30.05.2017 в 23:01. |
|
31.05.2017, 10:31 | #2 |
Участник
|
- "Вызывать класс напрямую - это моветон"
- "Info.add" это вызов класса => просто писать info.add это моветон. Я прошу показать бон тон. Цитата:
можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные.
как ? как дать пользователю пользователю? как проверить права? как обеспечить, чтобы это расширение работало и в пакетных заданиях. Вариант 2: Использовать SysIConditionalExtension Цитата:
говоришь, кто-то указал, что это final класс?
Цитата:
И какое же на твой взгляд?
А какое предназначение было у конструкторов, которых не будет? 2) Без конструкторов легко как и практически во всех компонентный моделях (метод init - те же самые RunBase получают параметры не из конструктора) |
|
31.05.2017, 11:15 | #3 |
Участник
|
Цитата:
info.add - это вызов метода класса через глобальную переменную infolog. в аксапте есть три общеизвестных глобальных предопределенных переменных - infolog, session, appl. ты точно хочешь продолжать защищать технологию атрибутов именно на этом примере? если хочешь продолжать, то обрати внимание, что метод info.add по идее должен был бы быть protected + нужно было бы объявлять friend классы (error, warning, info) для доступа к add. но в аксапте нет friend. Поэтому используется соглашение, что разработчики НЕ вызывают info.add, а должны пользоваться статическими методами Global::error, Global::warning, Global::info. Поэтому приведенный тобой пример предельно НЕ типичен для обычной работы обычных людей... Макс, я повторю вопрос - ты точно настаиваешь на этом примере в качестве обоснования технологи атрибутов? ===================== А бон тон очень просто - класс, у которого есть статический метод main с арзументом Agrs. для такого класса должен быть создан menuItem. вызвать класс через стандартную конструкцию new MenuFunction(menuitemDisplayStr(myMenuItem), MenuItemType::Display).run(args) К сожалению, среди разработчиков МС не принято беспокоится о правах доступа, поэтому часто вызывают класс напрямую через конструктор + run. Этот способ не назвать бон тоном, но по факту игнорировать этот способ нельзя - нужно думать о нем и поддерживать его тоже. Цитата:
Ты же сам сказал, что это "просто проставить атрибуты" Цитата:
Цитата:
Обрати внимание, что во всех статьях на эту тему рассматривается плоское одноуровневое наследование, а я спрашиваю про иерархию классов. Людям тоже придется иметь дело с иерахиями - их много в стандартной аксапте, их много в кастомизациях. Я думаю, что все уже давно увидели эту разницу и с нетерпением ждут ответа. Уверен, что ты легко приведешь изящный способ. Также обрати внимание, что ты отвечаешь про конструкторы. людям же нужно добавить функциональность, которую могут использовать пользователи. Нет, Макс, это не одно и то же. Нет, участники, это не придирка с словам и правописанию. Итак, формулировка: Цитата:
Сообщение от mazzy
Просто продемонстрируйте проектик с добавленной функциональностью, которую могут использовать пользователи со специальными правами,
в которой используется мощнейшая технология атрибутов и SysExtensionAppClassFactory::getClassFromSysAttribute. Ведь это ж "просто пометить атрибутом". Последний раз редактировалось mazzy; 31.05.2017 в 11:28. |
|
31.05.2017, 15:08 | #4 |
Banned
|
Цитата:
http://kashperuk.blogspot.co.uk/2017...extension.html является статьей двухмесячной давности. Основная описанная проблема - игнорирование аргументов с dictClass.makeObject(). SysExtension framework will instantiate a new instance of the corresponding class (dictClass.makeObject()), which ignores the constructor arguments. Предложенное решение - передавать обьект третьим параметром. In order to account for the constructor arguments we need to use an Instantiation strategy, which can then be passed in as the 3rd argument when calling SysExtensionAppClassFactory. Если посмотреть на сигнатуру SysExtensionAppClassFactory::getClassFromSysAttribute https://msdn.microsoft.com/en-us/lib...attribute.aspx то этот третий параметр существует как [SysExtAppClassDefaultInstantiation _defaultInstantiation]) Если проблема работы с многоуровневой иерархией решается то решается она через class SysExtAppClassDefaultInstantiation implements SysExtensionIInstantiationStrategy И вот эта самая Instantiation Strategy как-то и призвана решить все проблемы. X++: public class BaseClassWithArgInConstructor { //... public static BaseClassWithArgInConstructor construct(NoYesUnchanged _factoryType, str _argument) { NoYesUnchangedFactoryAttribute attr = new NoYesUnchangedFactoryAttribute(_factoryType); BaseClassWithArgInConstructor instance = SysExtensionAppClassFactory::getClassFromSysAttribute( classStr(BaseClassWithArgInConstructor), attr, [B]InstantiationStrategyForClassWithArg::construct(_argument)[/B]); return instance; } }. |
|
31.05.2017, 15:45 | #5 |
Участник
|
Цитата:
Сообщение от ax_mct
Приведенная ссылка
http://kashperuk.blogspot.co.uk/2017...extension.html является статьей двухмесячной давности. Извините. Цитата:
Ок. Верю. Вы утверждаете что "просто". Ок. Можно проектик? |
|
31.05.2017, 16:16 | #6 |
Banned
|
Цитата:
Но если в рамках темы то бишь AX2012 то не вижу смысла заморачиваться c этим фреймворком. Если AX7 то это лучше к Ване. У него там даже код есть. Проект: https://1drv.ms/f/s!ApLM1du7Goflnpl_RQlhOuzEW6fL-A Вот его продолжение про Instantiation strategy. using an instantiation strategy in combination with the SysExtensionIAttribute attribute was not supported. We have updated the SysExtension framework in Platform Update 5, so now you can rip the benefits of both worlds, using an instantiation strategy and implementing the SysExtensionIAttribute interface on the attribute. Development tutorial: SysExtension framework with SysExtensionIAttribute and an Instantiation strategy http://kashperuk.blogspot.co.uk/2017...ension_31.html Последний раз редактировалось ax_mct; 31.05.2017 в 16:20. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
31.05.2017, 16:22 | #7 |
Участник
|
а... это вы теоретически...
я уже говорил, что Повторю - замечательная патентованная технология. |
|
31.05.2017, 18:57 | #8 |
Участник
|
Цитата:
Цитата:
А бон тон очень просто - класс, у которого есть статический метод main с арзументом Agrs. для такого класса должен быть создан menuItem. вызвать класс через стандартную конструкцию
new MenuFunction(menuitemDisplayStr(myMenuItem), MenuItemType:isplay).run(args) Цитата:
К сожалению, среди разработчиков МС не принято беспокоится о правах доступа, поэтому часто вызывают класс напрямую через конструктор + run. Этот способ не назвать бон тоном, но по факту игнорировать этот способ нельзя - нужно думать о нем и поддерживать его тоже.
Цитата:
Обрати внимание, что во всех статьях на эту тему рассматривается плоское одноуровневое наследование, а я спрашиваю про иерархию классов. Людям тоже придется иметь дело с иерахиями - их много в стандартной аксапте, их много в кастомизациях. Я думаю, что все уже давно увидели эту разницу и с нетерпением ждут ответа. Уверен, что ты легко приведешь изящный способ.
Цитата:
Также обрати внимание, что ты отвечаешь про конструкторы.
людям же нужно добавить функциональность, которую могут использовать пользователи. |
|
31.05.2017, 19:33 | #9 |
Участник
|
способ опосредованный и не оптимальный. отвечу.
также напомню, что хотелось бы увидеть от тебя проект ) ты щас очень важный вещь сказал - надо подумать. а что будет, если ключ не уникальный? фреймворк создаст несколько инстансев с разными классами, но с одинаковым ключом? и как он будет работать с этими инстансами? типа параллельно? может, это в сторону асинхронной работы? бред, конечно. но вдруг? кто следит за уникальностью? и что делает с неуникальными ключами? надо подумать. и в код посмотреть. и подумать. на остальное отвечу позже. Последний раз редактировалось mazzy; 31.05.2017 в 19:36. |
|
31.05.2017, 20:05 | #10 |
Участник
|
Это зависит по идее от логики того. что расширяется. Если ему нужно что-то одно, то должен быть exception так как ситуация неоднозначная.
Если несколько, то надо дальше как-то их дергать. Например если у нас какие-ниьудь протоколяторы - один в файл. другой в инфолог, третий в EventLog то можно им раздавать информацию параллельно. |
|
Теги |
sysextension framework, sysoperation framework, как правильно, полезное |
|
|