2012-02-27 3 views
1

AX에서 새 Sales Order를 만드는 ASP.NET MVC 3 앱용 웹 서비스가 있습니다. AX에서 나는 현재 1 개의 메소드를 가지고있는 OnlineOrder 클래스를 만들었습니다. Sales Reference를 생성하는 것입니다. 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 메서드를 사용하여 객체를 인스턴스화하는 방법은 무엇입니까?

편집 :

내가 할 경우 :

 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

AxaptaStop 메서드를 호출 할 때 order 개체가 일종의 닫힘으로 작동하지 않는다.

IDisposable을 구현하는 클래스를 만들 것을 제안한 다음 Dispose 메서드에서 AxaptaStop을 호출하십시오. AxaptaStart 호출은 생성자에 전달 될 수 있습니다.

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

Dispose 자동으로 using statement에 의해 호출된다 :이 범위에 같은 AX 컨텍스트를 당신을 수 있습니다.

+0

그러나 이것도 내 webservice wouldnt에 대한 모든 1 메서드에 있어야합니다? 다른 메서드에서 같은 "order"객체를 어떻게 사용합니까? – CallumVass

+0

아니요. 'order' 객체는 예제에서와 같이 래퍼 메소드에서 반환되거나 멤버 변수에 저장 될 수 있습니다. COM에 대한 모든 호출은 추악한 세부 사항을 숨기는 래퍼 클래스에 숨겨져 있습니다. 또한 호출자의 코드가 멋지게 보입니다 (r). –

관련 문제