2012-02-27 20 views
1

AXで新しいSales Orderを作成するASP.NET MVC 3アプリケーションのWebサービスがあります。 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メソッドを使用するオブジェクトをインスタンス化するにはどうすればよいですか?

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オブジェクトに複数のメソッドを追加したいと有効な解決策ではありません私のWebサービス上で1つのメソッドでそれらをすべて呼びたくないのですが

答えて

3

オブジェクトは、AxaptaStopメソッドを呼び出すと一種のクローズとして機能しません。

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つのメソッドにもこれを必要とするでしょうか?どのように私は別のメソッドで同じ "オーダー"オブジェクトを使用するでしょうか? – CallumVass

+0

いいえ、そうではありません。 'order'オブジェクトは、この例のようにラッパーメソッドから返される(またはメンバ変数に保存されます)。 COMへのすべての呼び出しは、醜い詳細を隠すラッパークラスに隠されています。また、呼び出し元のコードがnice(r)に見えるようにします。 –