Есть внешний вебсервис, который надо вызывать из аксапты.
Для этого есть три разных wsdl: каждый соответствует соответствующей dev, test или prod инсталляции.
Набор объектов/методов в них одинаковые
Чтобы вызывать эти вебсервисы создано три c# проекта. У каждого свой namespace
SomeClass.DEV, SomeClass.TEST, SomeClass.PROD , но каждый по сути имеет внутри одну и ту же логику(один и тот же набор методов)
В AX соответственно пишется :
Если текущий environment = TEST, то myObj = MyPrjNamespace.TEST. methodAbc()
Если текущий environment = DEV, то myObj = MyPrjNamespace.DEV. methodAbc()
etc
Вообщем, выглядит коряво, но я не знаю, может, оно так и правильно? ((
В теории , мне кажется, можно было бы добавить все три wsdl в один проект и передавать параметр - методы из какого serviceRef вызывать. Но тут у меня возникает вопрос:
Если добавить в один проект три разных ServiceRef, то будет три namespace:
MyPrjNamespace.ServiceRef1, MyPrjNamespace.ServiceRef2, MyPrjNamespace.ServiceRef3
Соответственно, если есть сейчас какой-то метод, создающий некий объект:
createMyObj()
{
myObj = new MyPrjNamespace.ServiceRef1.objectToCreate();
}
то как должен выглядеть этот метод, если надо создать этот объект из соответствующего ServiceRef (одного из трех)?
То есть, можно ли, передав из аксапты имя текущего environment, присвоить некоторому alias выбранный namespace, и поэтому не писать вот так:
X++:
createMyObj()
{
if (environmentParam = 'DEV')
myObj = new MyPrjNamespace.ServiceRef1.objectToCreate();
if (environmentParam = 'TEST')
myObj = new MyPrjNamespace.ServiceRef2.objectToCreate();
if (environmentParam = 'UAT')
myObj = new MyPrjNamespace.ServiceRef3.objectToCreate();
}
createMyOtherObj()
{
if (environmentParam = 'DEV')
myOtherObj = new MyPrjNamespace.ServiceRef1.someOtherObjectToCreate();
if (environmentParam = 'TEST')
myOtherObj = new MyPrjNamespace.ServiceRef2.someOtherObjectToCreate();
if (environmentParam = 'UAT')
myOtherObj = new MyPrjNamespace.ServiceRef3.someOtherObjectToCreate();
}
а вот так - сразу установить alias:
X++:
setNameSpaceAlias()
{
if (environmentParam = 'DEV')
MyPrjNamespace.ServiceRefAlias = new MyPrjNamespace.ServiceRef1;
if (environmentParam = 'TEST')
MyPrjNamespace.ServiceRefAlias = new MyPrjNamespace.ServiceRef2;
if (environmentParam = 'UAT')
MyPrjNamespace.ServiceRefAlias = new MyPrjNamespace.ServiceRef3;
}
alias:
createMyObj()
{
myObj = new MyPrjNamespace.ServiceRefAlias.objectToCreate();
}
createMyOtherObj()
{
myOtherObj = new MyPrjNamespace.ServiceRefAlias.someOtherObjectToCreate();
}
etc
PS: Проблема в том, что сейчас у нас одна компания live, а хотят еще 2 запустить. Для каждой компании сделать по отдельному wsdl(все с одинаковыми методами) и получается, что код(как он написан сейчас, т.е по проекту на det/test/prod) аж 9 раз будет дублироваться (3 environment * 3 legal entities). Посоветуйте, как переключаться между 9 wsdl но при этом избежать дублирования кода