AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX Blogs
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search Mark Forums Read

 
 
Thread Tools Search this Thread Display Modes
Old 07.10.2017, 19:18   #1  
Blog bot is offline
Blog bot
Участник
 
25,644 / 848 (80) +++++++
Join Date: 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, напишите личное сообщение администратору.
Old 08.10.2017, 18:55   #2  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Join Date: 10.10.2005
Location: Westlands
Quote:
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?
Old 08.10.2017, 19:24   #3  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
Теперь тем кто вызывает заменяемый метод надо быть очень аккуратным - так как можно случайно не соблюсти какие-то внутренние инварианты класса при замене, а вызывающий код может понадеяться на это.

Я бы запретил вызывать оттуда private члены, например в-общем получается, что это как событие с дефолтным подписчиком, но не событие
Old 08.10.2017, 22:29   #4  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Quote:
Originally Posted by ax_mct View Post
Интересно. Спасибо.
Я правильно понимаю что проверка конфликта решений ISV не на этапе компиляции, а как runtime error?
Ну, на этапе компиляции и раньше не было. Раньше два ISV могли подписаться на один и тот же метод, и вернуть результат unconditionally.
Это приводило к ситуации "Last man wins" (ну или first man, не суть)

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

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


Да и вообще, сосуществование нескольких ISV решений - сложная тема. Если у кого-то есть идеи, как ее решить, я бы с удовольствием послушал.
Old 08.10.2017, 22:30   #5  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Quote:
Originally Posted by belugin View Post
Я бы запретил вызывать оттуда private члены, например в-общем получается, что это как событие с дефолтным подписчиком, но не событие
Так вроде ж и нет доступа к приватным методам и членам основного класса
Old 09.10.2017, 08:49   #6  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
Quote:
Originally Posted by kashperuk View Post
Так вроде ж и нет доступа к приватным методам и членам основного класса
Я имел ввиду в заменяемом а не в заменяющем - но потом подумал, что это аналогично protected методу.
Old 09.10.2017, 09:15   #7  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
Quote:
Originally Posted by kashperuk View Post
Если у кого-то есть идеи, как ее решить, я бы с удовольствием послушал.
Так как это все равно синтаксический сахар для события, сделать дополнительные конструкции для этого:
  • Расширение обязано проверить условия при которых оно может заменить метод и вызвать специяльную штуку "Я хоче заменить этот метод", а потом сделать, что ему надо
  • Вызываются все расширения, если у двух совпадают желания по замене метода, то exception.
This post has been rated by: trud (1).
Old 09.10.2017, 09:47   #8  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1635 (57) ++++++++
Join Date: 07.06.2003
Blog Entries: 1
Quote:
Originally Posted by belugin View Post
то exception.
Так и что будет делать пользователь с этим exception?
Old 09.10.2017, 10:17   #9  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
Quote:
Originally Posted by trud View Post
Так и что будет делать пользователь с этим exception?
Пользователь, это расплывчатое понятие. Конечный пользователь? Вообще как с любой другой ошибкой в софте - репортить программеру.

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

Last edited by belugin; 09.10.2017 at 10:24.
Old 09.10.2017, 11:01   #10  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1635 (57) ++++++++
Join Date: 07.06.2003
Blog Entries: 1
Quote:
Originally Posted by belugin View Post
Вообще как с любой другой ошибкой в софте - репортить программеру.
что за программер? ну т.е. я как конечный пользователь ставлю 2 сертифицированных решения из App store - у меня после этого перестает работать стандартный лукап по складам. т.е. по идее это ошибка MS(у разработчиков решений то все работает)
т.е. что должен суппорт MS делать с такой ошибкой?
This post has been rated by: mazzy (2).
Old 09.10.2017, 11:22   #11  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
Quote:
Originally Posted by trud View Post
по идее это ошибка MS(у разработчиков решений то все работает)
То что у разработчика расширения все работает, это не значит что ошибка не его. Например у него может быть локаль EN-US а у пользователя тайская, и он это не учел. Как и возможность наличия расширения.

Я не знаю, как решает такие вопросы саппорт, как и вопросы при любых 3rd party расширениях для всего чего угодно. Наверное должен быть кто-то, кто поддерживает весь комплект в целом. Так же как если у вас антифирус конфликтует с какой-нибудь утилитой вы обращаетесь к сисадмину.
Old 09.10.2017, 12:00   #12  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1635 (57) ++++++++
Join Date: 07.06.2003
Blog Entries: 1
Quote:
Originally Posted by belugin View Post
Как и возможность наличия расширения.
так а как разработчик должен это учесть? т.е. если вы предлагаете генерить исключение, надо наверное и предлагать механизм обработки этого исключения. если механизма обработки нет, зачем тогда его генерить?
вообще вот отличное описание о "будущем" NAV, странно что для АХ не сделают подобное.
russianerpexperience: Как вендор партнёра услышал, или будет ли Россия в облаке: новости о новейшей системе Dynamics 365 'Tenerife' с Directions EMEA 2017

т.е. решения надо делать на полностью extension и не extension(давая клиенту выбирать)
для "не extension" иметь список перегруженных методов, соответственно додумывая дальше при установке 2 решений которые меняют одно и тоже выдавать конфликт(т.е. не давать ставить вообще если решения конфликтуют и возможности мержить код нет - например нет исходного кода), если возможность мержинга есть то выдавать что мержить - но это правда будет текущая модель работы из 2012
Old 09.10.2017, 12:49   #13  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
Quote:
Originally Posted by trud View Post
так а как разработчик должен это учесть? т.е. если вы предлагаете генерить исключение, надо наверное и предлагать механизм обработки этого исключения. если механизма обработки нет, зачем тогда его генерить?
Учесть так - заменять собой метод только если есть полный контроль над условиями перекрытия. Например, проводка относится к типу который введен вами. (тут, кстати, непонятно как это сделать гарантировано - то есть, если другое расширение будет по какому-то другому независимому признаку определять что именно оно должно перекрыть - надо тогда чтобы была гарантия что пространства параметров не пересекается, то есть у метода должен быть ровно один параметр типа enum).

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

Quote:
т.е. решения надо делать на полностью extension и не extension(давая клиенту выбирать)
для "не extension" иметь список перегруженных методов, соответственно додумывая дальше при установке 2 решений которые меняют одно и тоже выдавать конфликт(т.е. не давать ставить вообще если решения конфликтуют и возможности мержить код нет - например нет исходного кода), если возможность мержинга есть то выдавать что мержить - но это правда будет текущая модель работы из 2012
Ну я собственно с этим согласен - если давать менять метод произвольным образом, то это хуже оверлееринга. Надо либо сводить к гарантированно работтающих (в рамках каких-то допущений) либо к оверлеерингу.
This post has been rated by: ax_mct (3).
Old 09.10.2017, 14:45   #14  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Join Date: 10.10.2005
Location: Westlands
Quote:
Originally Posted by kashperuk View Post

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

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

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

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

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
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
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 15:40.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.