AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX Blogs
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.10.2017, 19:18   #1  
Blog bot is offline
Blog bot
Участник
 
19,459 / 657 (60) +++++++
Регистрация: 28.10.2006
Kashperuk Ivan: Development tutorial: Extensibility: Replaceable in Chain of Command methods
Источник: http://kashperuk.blogspot.com/2017/1...ibility_7.html
==============

Recently we announced a new and pretty powerful Extensibility feature, wrapping methods with Chain of Command in augmentation classes. This allows to write much cleaner extensions with fewer lines of code, as well as provides some extra capabilities like access to protected fields and methods of augmented object, easier way of ensuring a single transaction scope for standard and extension code,

Источник: http://kashperuk.blogspot.com/2017/1...ibility_7.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 08.10.2017, 18:55   #2  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,681 / 531 (21) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Note that by definition that means only one of the ISV solutions can replace it. If two attempt to accept() the result, an error will be shown.
That would typically mean that a logical conflict exists between the two ISV solutions, and the VAR would need to decide which ones to use, or make it configurable somehow.
Интересно. Спасибо.
Я правильно понимаю что проверка конфликта решений ISV не на этапе компиляции, а как runtime error?
Старый 08.10.2017, 19:24   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,986 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Теперь тем кто вызывает заменяемый метод надо быть очень аккуратным - так как можно случайно не соблюсти какие-то внутренние инварианты класса при замене, а вызывающий код может понадеяться на это.

Я бы запретил вызывать оттуда private члены, например в-общем получается, что это как событие с дефолтным подписчиком, но не событие
Старый 08.10.2017, 22:29   #4  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,340 / 2038 (76) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Интересно. Спасибо.
Я правильно понимаю что проверка конфликта решений ISV не на этапе компиляции, а как runtime error?
Ну, на этапе компиляции и раньше не было. Раньше два ISV могли подписаться на один и тот же метод, и вернуть результат unconditionally.
Это приводило к ситуации "Last man wins" (ну или first man, не суть)

С введением конструктора EventHandlerResult::singleResponse() теперь упадет ошибка, что, мол, попытка повторного вызова - это подобно тому, как это сделано в SysExtension framework

К сожалению, с Replaceable так не получается, то есть опять возвращаемся к First Man Wins - если безусловно не вызывать next() и ваш код вызовется первым, то у остальных не будет шанса, даже если по условиям ваш код ничего бы доп не сделал.


Да и вообще, сосуществование нескольких ISV решений - сложная тема. Если у кого-то есть идеи, как ее решить, я бы с удовольствием послушал.
Старый 08.10.2017, 22:30   #5  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,340 / 2038 (76) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Цитата:
Сообщение от belugin Посмотреть сообщение
Я бы запретил вызывать оттуда private члены, например в-общем получается, что это как событие с дефолтным подписчиком, но не событие
Так вроде ж и нет доступа к приватным методам и членам основного класса
Старый 09.10.2017, 08:49   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,986 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Так вроде ж и нет доступа к приватным методам и членам основного класса
Я имел ввиду в заменяемом а не в заменяющем - но потом подумал, что это аналогично protected методу.
Старый 09.10.2017, 09:15   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,986 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Если у кого-то есть идеи, как ее решить, я бы с удовольствием послушал.
Так как это все равно синтаксический сахар для события, сделать дополнительные конструкции для этого:
  • Расширение обязано проверить условия при которых оно может заменить метод и вызвать специяльную штуку "Я хоче заменить этот метод", а потом сделать, что ему надо
  • Вызываются все расширения, если у двух совпадают желания по замене метода, то exception.
За это сообщение автора поблагодарили: trud (1).
Старый 09.10.2017, 09:47   #8  
trud is offline
trud
Участник
 
451 / 315 (11) ++++++
Регистрация: 07.06.2003
Цитата:
Сообщение от belugin Посмотреть сообщение
то exception.
Так и что будет делать пользователь с этим exception?
Старый 09.10.2017, 10:17   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,986 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от trud Посмотреть сообщение
Так и что будет делать пользователь с этим exception?
Пользователь, это расплывчатое понятие. Конечный пользователь? Вообще как с любой другой ошибкой в софте - репортить программеру.

Расширения ISV не должны брать ответсвенности за условия, про которые не знают.

Последний раз редактировалось belugin; 09.10.2017 в 10:24.
Старый 09.10.2017, 11:01   #10  
trud is offline
trud
Участник
 
451 / 315 (11) ++++++
Регистрация: 07.06.2003
Цитата:
Сообщение от belugin Посмотреть сообщение
Вообще как с любой другой ошибкой в софте - репортить программеру.
что за программер? ну т.е. я как конечный пользователь ставлю 2 сертифицированных решения из App store - у меня после этого перестает работать стандартный лукап по складам. т.е. по идее это ошибка MS(у разработчиков решений то все работает)
т.е. что должен суппорт MS делать с такой ошибкой?
За это сообщение автора поблагодарили: mazzy (2).
Старый 09.10.2017, 11:22   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,986 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от trud Посмотреть сообщение
по идее это ошибка MS(у разработчиков решений то все работает)
То что у разработчика расширения все работает, это не значит что ошибка не его. Например у него может быть локаль EN-US а у пользователя тайская, и он это не учел. Как и возможность наличия расширения.

Я не знаю, как решает такие вопросы саппорт, как и вопросы при любых 3rd party расширениях для всего чего угодно. Наверное должен быть кто-то, кто поддерживает весь комплект в целом. Так же как если у вас антифирус конфликтует с какой-нибудь утилитой вы обращаетесь к сисадмину.
Старый 09.10.2017, 12:00   #12  
trud is offline
trud
Участник
 
451 / 315 (11) ++++++
Регистрация: 07.06.2003
Цитата:
Сообщение от belugin Посмотреть сообщение
Как и возможность наличия расширения.
так а как разработчик должен это учесть? т.е. если вы предлагаете генерить исключение, надо наверное и предлагать механизм обработки этого исключения. если механизма обработки нет, зачем тогда его генерить?
вообще вот отличное описание о "будущем" NAV, странно что для АХ не сделают подобное.
russianerpexperience: Как вендор партнёра услышал, или будет ли Россия в облаке: новости о новейшей системе Dynamics 365 'Tenerife' с Directions EMEA 2017

т.е. решения надо делать на полностью extension и не extension(давая клиенту выбирать)
для "не extension" иметь список перегруженных методов, соответственно додумывая дальше при установке 2 решений которые меняют одно и тоже выдавать конфликт(т.е. не давать ставить вообще если решения конфликтуют и возможности мержить код нет - например нет исходного кода), если возможность мержинга есть то выдавать что мержить - но это правда будет текущая модель работы из 2012
Старый 09.10.2017, 12:49   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,986 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от trud Посмотреть сообщение
так а как разработчик должен это учесть? т.е. если вы предлагаете генерить исключение, надо наверное и предлагать механизм обработки этого исключения. если механизма обработки нет, зачем тогда его генерить?
Учесть так - заменять собой метод только если есть полный контроль над условиями перекрытия. Например, проводка относится к типу который введен вами. (тут, кстати, непонятно как это сделать гарантировано - то есть, если другое расширение будет по какому-то другому независимому признаку определять что именно оно должно перекрыть - надо тогда чтобы была гарантия что пространства параметров не пересекается, то есть у метода должен быть ровно один параметр типа enum).

Мне кажется обработка исключений, кроме нескольких, заключается в том, чтобы прервать текущий процесс и вывести сообщение об ошибке.

Цитата:
т.е. решения надо делать на полностью extension и не extension(давая клиенту выбирать)
для "не extension" иметь список перегруженных методов, соответственно додумывая дальше при установке 2 решений которые меняют одно и тоже выдавать конфликт(т.е. не давать ставить вообще если решения конфликтуют и возможности мержить код нет - например нет исходного кода), если возможность мержинга есть то выдавать что мержить - но это правда будет текущая модель работы из 2012
Ну я собственно с этим согласен - если давать менять метод произвольным образом, то это хуже оверлееринга. Надо либо сводить к гарантированно работтающих (в рамках каких-то допущений) либо к оверлеерингу.
За это сообщение автора поблагодарили: ax_mct (3).
Старый 09.10.2017, 14:45   #14  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,681 / 531 (21) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от kashperuk Посмотреть сообщение

Да и вообще, сосуществование нескольких ISV решений - сложная тема. Если у кого-то есть идеи, как ее решить, я бы с удовольствием послушал.
Думаю что решить эту проблему можно только на конечном клиенте. Для этого нужен полный контроль над всем кодом тем кто будет эту проблему решать.

На уровне поставщика платформы задача выглядит решаемой только если ограничить ISV до нескольких и очень тесно с ними работать. Что судя по всему и происходит и что судя по всему и является целью. Что имеет все шансы на успех но с совсем другими партнерами и клиентами.

"Быстро, дешево, много" в части инсталляций - вполне работающий для прибыли для того у кого в руках контроль. Но рынка ISV рынка для D365FOE не будет, будет не больше одного ISV решения для бизнес-процессов на конкретном внедрении вот и все. И то если именно Microsоft будет формально или неформально гарантировать его совместимость.

То есть тесная совместная работа Microsоft с 1-5 ISV и все. Между собой все решат и так я полагаю.
Теги
chain of command

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kashperuk Ivan: Development Tutorial: Extensibility: Adding a table display/edit method and showing it on a form in PU11 Blog bot DAX Blogs 2 09.10.2017 13:36
Kashperuk Ivan: Development Tutorial: Extensibility: Adding a table display/edit method and showing it on a form in PU10 Blog bot DAX Blogs 20 07.10.2017 12:42
Kashperuk Ivan: Development tutorial: SysExtension framework with SysExtensionIAttribute and an Instantiation strategy Blog bot DAX Blogs 0 01.04.2017 02:17
Kashperuk Ivan: Development tutorial link: Extensibility challenges: Pack/Unpack in RunBase classes Blog bot DAX Blogs 0 01.04.2017 02:17
Kashperuk Ivan: Development tutorial: SysExtension framework in factory methods where the constructor requires one or more arguments Blog bot DAX Blogs 4 19.03.2017 23:56
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:16.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.