2012-02-27 4 views
1

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

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?

EDIT:

Если я:

 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 в будущем, и я не хочу называть их всех одним методом на моем веб-сервисе

ответ

3

Это никогда не будет работать, поскольку объект 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 statement.

+0

Но это также потребовало бы, чтобы все это было в одном методе на моем веб-сервисе, не так ли? Как использовать один и тот же объект «порядка» в другом методе? – CallumVass

+0

Нет, это не так. Объект 'order' может быть возвращен из метода оболочки, как в примере (или сохранен в переменной-члене). Все вызовы COM скрыты в вашем классе-оболочке, скрывая уродливые детали. Это также делает ваш код от вызывающего лица приятным (r). –

Смежные вопросы