2012-02-27 148 views
1

我的ASP.NET MVC 3應用程序有一個Web服務,它在AX中創建一個新的銷售訂單。在AX中,我創建了一個現在有1個方法的OnlineOrder類。它是生成銷售參考。下面是我的web服務代碼:無法讓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; 
     } 

這工作,但這不是因爲我想更多的方法在未來,我將添加到我的網上訂單對象的有效解決方案不想在我的web服務中使用1種方法全部打電話給他們

回答

3

這種方式永遠不會起作用,因爲當您調用AxaptaStop方法時,order對象有點關閉。

我會建議創建一個實現IDisposable的類,然後在Dispose方法中調用AxaptaStop。調用AxaptaStart可以去構造函數。這將允許您範圍,如AX背景:

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

Disposeusing statement自動調用。

+0

但是,這也需要這一切都在我的web服務的1方法wouldnt它?我將如何使用不同方法中的相同「訂單」對象? – CallumVass 2012-02-28 08:14:31

+0

不,它不會。 'order'對象可以像例子那樣從包裝方法中返回(或保存在一個成員變量中)。所有對COM的調用都隱藏在隱藏了醜陋細節的包裝類中。它也使得來自調用者的代碼看起來很好(r)。 – 2012-02-28 11:01:46