|
31.05.2017, 11:15 | #1 |
Участник
|
Цитата:
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 | #2 |
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 | #3 |
Участник
|
Цитата:
Сообщение от ax_mct
Приведенная ссылка
http://kashperuk.blogspot.co.uk/2017...extension.html является статьей двухмесячной давности. Извините. Цитата:
Ок. Верю. Вы утверждаете что "просто". Ок. Можно проектик? |
|
31.05.2017, 16:16 | #4 |
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 | #5 |
Участник
|
а... это вы теоретически...
я уже говорил, что Повторю - замечательная патентованная технология. |
|
31.05.2017, 18:57 | #6 |
Участник
|
Цитата:
Цитата:
А бон тон очень просто - класс, у которого есть статический метод main с арзументом Agrs. для такого класса должен быть создан menuItem. вызвать класс через стандартную конструкцию
new MenuFunction(menuitemDisplayStr(myMenuItem), MenuItemType:isplay).run(args) Цитата:
К сожалению, среди разработчиков МС не принято беспокоится о правах доступа, поэтому часто вызывают класс напрямую через конструктор + run. Этот способ не назвать бон тоном, но по факту игнорировать этот способ нельзя - нужно думать о нем и поддерживать его тоже.
Цитата:
Обрати внимание, что во всех статьях на эту тему рассматривается плоское одноуровневое наследование, а я спрашиваю про иерархию классов. Людям тоже придется иметь дело с иерахиями - их много в стандартной аксапте, их много в кастомизациях. Я думаю, что все уже давно увидели эту разницу и с нетерпением ждут ответа. Уверен, что ты легко приведешь изящный способ.
Цитата:
Также обрати внимание, что ты отвечаешь про конструкторы.
людям же нужно добавить функциональность, которую могут использовать пользователи. |
|
31.05.2017, 19:33 | #7 |
Участник
|
способ опосредованный и не оптимальный. отвечу.
также напомню, что хотелось бы увидеть от тебя проект ) ты щас очень важный вещь сказал - надо подумать. а что будет, если ключ не уникальный? фреймворк создаст несколько инстансев с разными классами, но с одинаковым ключом? и как он будет работать с этими инстансами? типа параллельно? может, это в сторону асинхронной работы? бред, конечно. но вдруг? кто следит за уникальностью? и что делает с неуникальными ключами? надо подумать. и в код посмотреть. и подумать. на остальное отвечу позже. Последний раз редактировалось mazzy; 31.05.2017 в 19:36. |
|
31.05.2017, 20:05 | #8 |
Участник
|
Это зависит по идее от логики того. что расширяется. Если ему нужно что-то одно, то должен быть exception так как ситуация неоднозначная.
Если несколько, то надо дальше как-то их дергать. Например если у нас какие-ниьудь протоколяторы - один в файл. другой в инфолог, третий в EventLog то можно им раздавать информацию параллельно. |
|
Теги |
sysextension framework, sysoperation framework, как правильно, полезное |
|
|