Не удается заставить Axapta.CreateAxaptaObject() работать

У меня есть веб-служба для моего приложения ASP.NET MVC 3, которое создает новый заказ на продажу в AX. В AX я создал класс OnlineOrder, который на данный момент имеет 1 метод. Это для создания справки о продажах. Ниже приведен код в моем веб-сервисе:

public AxaptaObject order;

        public void CreateOrder()
        {
            AxaptaStart();
            order = Axapta.CreateAxaptaObject("OnlineOrder");
            AxaptaStop();
        }

        public string GetSalesRef(string username, string delivery, string reference)
        {

            AxaptaStart();
            string number = order.Call("orderCreate", username, delivery, reference).ToString();
            AxaptaStop();
            return number;
        }

Затем в моем контроллере я вызываю эти методы:

            client.CreateOrder();

            string number = client.GetSalesRef(user.Username, order.deliverymethod, order.custorder).ToString();

Это не работает, и информация об исключении не отображается, это просто пустое сообщение. Я считаю, что order AxaptaObject не относится к типу OnlineOrder, поэтому он не может вызывать эти методы. Как мне создать экземпляр объекта для использования метода orderCreate?

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

If I do:

        public string CreateOrder(string username, string delivery, string reference)
        {
            AxaptaStart();
            order = Axapta.CreateAxaptaObject("OnlineOrder");
            string number = order.Call("orderCreate", username, delivery, reference).ToString();
            AxaptaStop();
            return number;
        }

Это работает, но это недопустимое решение, так как я хотел бы добавить больше методов к моему объекту OnlineOrder в будущем, и я не хочу вызывать их все в одном методе в моем веб-сервисе.


person CallumVass    schedule 27.02.2012    source источник


Ответы (1)


Это никогда не сработает, так как объект order как бы закрывается, когда вы вызываете метод AxaptaStop.

Я предлагаю создать класс, реализующий IDisposable, а затем вызвать AxaptaStop в метод Dispose. Вызов AxaptaStart может перейти к конструктору. Это позволит вам охватить контекст AX, например:

using (var axWrap = new AxWrap())
{
    var order = axWrap.onlineOrder();
    var number = axWrap.orderCreate(order, username, delivery, reference);
}

Dispose автоматически вызывается оператором using.

person Jan B. Kjeldsen    schedule 27.02.2012
comment
Но это также потребует, чтобы все это было в 1 методе на моем веб-сервисе, не так ли? Как бы я использовал один и тот же объект заказа в другом методе? - person CallumVass; 28.02.2012
comment
Нет, не будет. Объект order может быть возвращен из метода-оболочки, как в примере (или сохранен в переменной-члене). Все вызовы COM скрыты в вашем классе-оболочке, скрывая уродливые детали. Это также делает ваш код от вызывающей стороны красивым (r). - person Jan B. Kjeldsen; 28.02.2012