Saga et réponse en Json

Bonjour,

Depuis un package 1, j’envoi comme réponse en saga du json :

        [MessageCallback]
        Test Get_Coordinate(string address)
        {

            return new Test() { Longitude = longitude, Latitude = latitude };

        }

        public class Test
        {
            /// <summary>
            /// Latitude du lieu
            /// </summary>
            public string Latitude { get; set; }

            /// <summary>
            /// Longitude du lieu
            /// </summary>
            public string Longitude { get; set; }
        }

Le problème est que je n’arrive pas à récupérer le Json sans redéfinir la classe dans le package 2 :

 

        [MessageCallback]
        public void test_saga()
        {
            MessageScope.Create("Coordinates").OnSagaResponse((response) =>
            {
                PackageHost.WriteInfo("test saga");
                dynamic test = JsonConvert.DeserializeObject(response);
                PackageHost.WriteInfo(test.Latitude);

            }).GetProxy().Get_Coordinate<dynamic>("12 rue basfroi 75011 Paris");
        }

Suis je obliger de définir la class Test dans les deux package ?

Merci.

Hello,

Non tu n’as ni besoin de re-definir la classe Test (tu travailleras alors sur un objet dynamic) et tu n’as pas non plus besoin de desérializer, c’est l’API Constellation qui s’en charge :

        [MessageCallback]
        public void test_saga()
        {
            MessageScope.Create("Coordinates").OnSagaResponse((response) =>
            {
                PackageHost.WriteInfo("test saga");
                PackageHost.WriteInfo(response.Latitude);

            }).GetProxy().Get_Coordinate("12 rue basfroi 75011 Paris");

Pas besoin non plus de faire une “Get_Coordinate<dynamic>” tu peux simplement invoquer ton MC par “Get_Coordinate” (sans le générique) !

La forme avec générique sert lorsque tu veux que la méthode te retourne une Task<dynamic> (voir ici). DOnc soit tu travailles avec les Task soit avec un callback de retour via OnSagaResponse !

A+

En fait, les PackageHost.Write(INfo/Warn/Error) prennent un format en string suivi d’une liste d’objet pour le formatage du message.

Comme “Latitude” est une propriété dynamique de l’objet dynamic “response” tu ne peux pas juste l’envoyer dans un PackageHost.WriteInfo!

Deux solutions :

  • Le caster en string: PackageHost.WriteInfo((string)response.Latitude);
  • Le formater : PackageHost.WriteInfo("{0}", response.Latitude);
J'ai retesté ton exemple. Ton objet "Test" devrait définir des "double" ou décimal pour les coordonnées GPS :
public class Test
{
    /// <summary>
    /// Latitude du lieu
    /// </summary>
    public double Latitude { get; set; }
/// &lt;summary&gt;
/// Longitude du lieu
/// &lt;/summary&gt;
public double Longitude { get; set; }

}


De ce fait côté “client” :
MessageScope.Create("Coordinates").OnSagaResponse((response) =>
{
    PackageHost.WriteInfo("Resultat : {0}, {1}", response.Latitude, response.Longitude);

}).GetProxy().Get_Coordinate("12 rue basfroi 75011 Paris");

Ou avec la syntaxe des “Task” :

Task<dynamic> task = PackageHost.CreateMessageProxy("MonPremierPackage").Get_Coordinate<dynamic>("12 rue basfroi 75011 Paris");
if (task.Wait(5000) && task.IsCompleted)
{
    PackageHost.WriteInfo("Resultat : {0}, {1}", task.Result.Latitude, task.Result.Longitude);
}

N’hesites pas à lire la doc, je viens de finir le “chapitre” sur les Tasks !