Управление различными конфигурациями проектов в Dynamics AX

У нас есть проблемы с разделением наших различных конфигураций. Позвольте мне немного объяснить

Сценарий:

Допустим, у вас есть два проекта AX, например. P и M, которые изменяют таблицу ProdRouteJob, вызывая методы в одном из своих собственных классов, специфичных для проекта.
У вас есть все эти классы на вашем компьютере разработчика, Конечно, и ProdRouteJob компилируется нормально, но для установки на новый сервер вы не хотите добавлять классы-заглушки для каждого неустановленного проекта, не так ли? Таким образом, вы оборачиваете эти вызовы в классы проекта чем-то вроде

if( Global::isConfigurationkeyEnabled( <projectPConfKey> ) )  
     // call project P stuff

чтобы инкапсулировать их чисто. Вы объявляете ключи конфигурации для всех своих проектов и готовы к работе, верно?

Однако это вызывает ошибку, если вы не установили проект P на этом компьютере, поскольку его projectPConfKey неизвестен. Теперь вы можете при каждой установке устанавливать ключи конфигурации для всех ваших проектов, просто чтобы сообщить серверу, что существует такая вещь, как projectPConfKey, но тогда все эти if будут оцениваться как истинные...

Вкратце: как вы включаете конфигурационные ключи в XPO вашего проекта, чтобы ваш код компилировался, но в то же время чтобы некоторые конфигурационные ключи были отключены с самого начала?

Или есть что-то совершенно основное, что мне здесь не хватает?

РЕДАКТИРОВАТЬ:

Консенсус среди ответов (спасибо, демас; спасибо, г-н Кьелдсен) заключается в том, что нецелесообразно пытаться более или менее автоматически настроить клиентскую сторону с помощью макросов или ключей конфигурации. Таким образом, когда мы устанавливаем на клиенте, нам придется импортировать стандартные таблицы с нашими изменениями и вручную выносить все изменения, не относящиеся к текущей установке.

Я немного в растерянности, какой ответ принять, потому что Дэмас ответил на вопрос, который я задал, а г-н Кьелдсен ответил на вопросы, возникшие в беседе с комментариями под ответом Дэмаса. Я, с извинениями перед г-ном Кьельдсеном, отмечу ответ Демаса как принятый.


person Christian Severin    schedule 26.11.2010    source источник


Ответы (2)


if( Global::isConfigurationkeyEnabled( <projectPConfKey> ) ) 

Эта проверка работает только во время выполнения и при компиляции кода вы получаете ошибку.

Поэтому вам нужно создавать классы-заглушки или сравнивать объекты, когда вы импортируете их на рабочий сервер и импортируете только изменения проекта M.

Есть еще один подход, но у меня нет Axapta, чтобы его проверить. Пытаться:

#if.never
someMissingCall();
#endif

Но я не уверен, что это будет работать сейчас.

person demas    schedule 26.11.2010
comment
#if.never работает: проверяет, не был ли определен вызываемый макрос. То есть вы имеете в виду, что мы должны просто объявить макросы, такие как ProjectP или ProjectM, в наших соответствующих проектах и ​​использовать #if.ProjectP для комментирования частей кода, специфичных для нашего проекта? - person Christian Severin; 26.11.2010
comment
Да, это одно из решений. Но я думаю, что вам нужно удалить этот макрос при установке обоих проектов. Я просто сравниваю объекты при их импорте в производственную систему и импортирую только необходимые части кода. - person demas; 26.11.2010
comment
Почему мы должны удалять макросы при установке обоих проектов? В любом случае это должно работать нормально, не так ли? Этот хак с проверкой макросов, безусловно, уродлив, но эй: если он избавит нас от необходимости просматривать десятки таблиц и классов, чтобы отсеять специфические для проекта вещи... - person Christian Severin; 26.11.2010
comment
Но как большие центры решений с потенциально десятками проектов управляют своими дополнениями к стандартной кодовой базе? Вы хотите сказать, что они садятся и вычищают все упоминания о неустановленных проектах после установки? Или они сначала устанавливают полный набор фиктивных классов и перезаписывают их реальными вещами там, где это необходимо для текущих проектов? - person Christian Severin; 26.11.2010
comment
Я работаю в большом партере MBS и да - вычищаем все упоминания о неустановленных проектах. Это не требует много времени. Вы смотрите на инструмент сравнения в Axapta? - person demas; 26.11.2010
comment
Вот чего я боялся: вручную просмотреть каждый стандартный класс или таблицу, к которым мы прикасались при импорте, чтобы увидеть, нужны ли изменения для этой конкретной настройки. вздох - person Christian Severin; 02.12.2010

Большие центры решений (VAR) обычно имеют отдельные приложения для каждого модуля. Если у вас есть 2 модуля, у вас есть 2 приложения.

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

Затем конфликты со стандартными и другими модулями обрабатываются вручную во время установки. Так как область коллизий небольшая и меняется редко (она не должна содержать бизнес-логику), проблема минимальна.

person Jan B. Kjeldsen    schedule 26.11.2010
comment
Конечно: вы всегда пытаетесь свести к минимуму свое влияние на стандартные вещи. Но тем не менее, если в этих центрах решений есть полдюжины приложений, которые все изменяют, скажем, что-то в стандартной ProdTable, вы можете получить несколько десятков вызовов методов, которые присутствуют только в НЕКОТОРЫХ их приложениях. Или они аккуратно строят каждый проект на отдельном сервере разработки и объединяют их только на клиенте? - person Christian Severin; 28.11.2010
comment
Они аккуратно строят каждый проект на отдельном сервере разработки и объединяют их только на клиенте? Если проект равен модулю, то да. Если проект равен новой разработке для клиента XYZ, то нет. Но в таком случае все проекты в конечном итоге заканчиваются на установке заказчика, тогда в чем проблема? - person Jan B. Kjeldsen; 30.11.2010