2012-02-27 7 views
1

J'ai un service Web pour mon application ASP.NET MVC 3 qui crée une nouvelle commande client dans AX. Dans AX j'ai créé une classe OnlineOrder qui a pour l'instant 1 méthode. C'est pour générer une référence de vente. Voici le code dans mon service web:Impossible de faire fonctionner 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; 
     } 

Puis dans mon contrôleur j'appelle ces méthodes:

  client.CreateOrder(); 

      string number = client.GetSalesRef(user.Username, order.deliverymethod, order.custorder).ToString(); 

Cela ne fonctionne pas et il n'y a pas d'info d'exception à montrer, juste un vide message. Je crois que le order AxaptaObject n'est pas de type OnlineOrder donc il ne peut pas appeler ces méthodes. Comment instancier l'objet pour utiliser la méthode orderCreate?

EDIT:

Si je fais:

 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; 
     } 

Cela fonctionne, mais ce n'est pas une solution valable que je voudrais ajouter d'autres méthodes à mon objet OnlineOrder à l'avenir et je Je ne veux pas tous les appeler dans la méthode 1 sur mon service Web

Répondre

3

Cela ne fonctionnera jamais car l'objet order est en quelque sorte fermé lorsque vous appelez la méthode AxaptaStop.

Je vais suggérer de créer une classe implémentant IDisposable, puis d'appeler AxaptaStop dans la méthode Dispose. L'appel AxaptaStart peut aller au constructeur. Cela vous permettra de champ le contexte AX comme:

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

Le Dispose est automatiquement appelé par le using statement.

+0

Mais cela nécessiterait aussi que tout soit en 1 méthode sur mon webservice wouldnt-il? Comment utiliser le même objet "order" dans une méthode différente? – CallumVass

+0

Non ce ne serait pas. L'objet 'order' peut être renvoyé à partir de la méthode wrapper comme dans l'exemple (ou enregistré dans une variable membre). Tous les appels à COM sont cachés dans votre classe d'emballage cachant les détails laids. Cela rend également votre code de l'appelant agréable (r). –