2012-02-27 145 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