2010-07-16 4 views
2

je besoin d'un moyen flexible pour connecter des paires KeyValue d'arguments en utilisant System.Diagnostics.Trace.Comment se connecter facilement un dictionnaire d'arguments et sérialiser à l'aide JSON Trace en C#

En fait, quand je dois quelque chose dans le code log je voudrais faire un appel de méthode qui passe un message et un dictionnaire de valeurs. Ce n'est évidemment pas dur mais je veux le rendre propre et si possible appliquer les noms de clés qui sont autorisés. C'est parce que je veux être en mesure d'analyser les valeurs de la paire de clés plus tard et de construire un visualiseur de journal qui vous permet de rechercher et trier par les arguments qui ont été consignés.

Une façon que je l'ai expérimenté avec utilisait les nouveaux .Net 4 paramètres de la méthode en option.

public static void LogInformation(string message, int? someID = null, string someValue = null, int? anotherID = null, int? andAnotherID = null) 

Je pourrais alors l'appeler cela comme:

Logger.LogInformation("themessage", someID:5, andAnotherID:2); 

Cette méthode serait alors vérifier tous les paramètres et si elle avait une valeur alors il ajouter à un dictionnaire intégré en interne en utilisant des noms clés cohérents. Je voudrais alors sérialiser le dictionnaire en JSON et le passer à la méthode Trace.LogInformation en tant que message. Mais cela semble beaucoup trop compliqué à maintenir. Je devrais continuer à ajouter de nouvelles lignes dans cette méthode à mesure que notre base de code grandissait et que de nouvelles valeurs devaient être enregistrées.

J'ai aussi essayé d'abandonner l'idée de verrouiller sur les noms clés et juste essayer de trouver un moyen simple de passer KeyPair valeurs à une méthode de journal sans avoir à faire:

LogInformation("themessage", new Dictionary<string,string>(){{"someID","1"},{"andAnotherID","2"}}); 

J'ai essayé en descendant la route & de type dynamique anonyme afin que le développeur pourrait appeler la méthode comme ceci:

LogInformation("themessage", new { someID = 1, andAnotherID = 2 }); 

Mais vous ne pouvez pas utiliser les bibliothèques de sérialisation standard pour transformer cet objet anonyme ou dynamique en JSON.

Y at-il d'autres options ou idées que je devrais enquêter? La performance est évidemment quelque chose que je dois considérer aussi, puisque cette méthode sera appelée de partout.

Répondre

1

Vous pouvez réellement sérialiser un objet anonyme à JSON en utilisant le JavaScriptSerializer

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
var output = serializer.Serialize(your_anon_object); 

voir ce fil:

How do I serialize a C# anonymous type to a JSON string?

Et si vous voulez faire respecter certaines « clés », est-il raison pour laquelle vous ne voulez pas seulement utiliser une classe fortement typée?

+0

Parce que la liste de valeurs possibles pour se connecter va continuer de croître et de plus en plus. En outre, je ne voulais pas utiliser JavaScriptSerializer car je pensais que c'était obsolète. On dirait que ce n'est plus. – Vyrotek

+0

OK. Toutefois, si vous ne devez pas compiler définir le temps d'exécution des « clés », vous devrez les définir quelque part le temps, et je ne vois pas le problème avec une classe avec beaucoup de propriétés. (certaines personnes font cependant, question de goût je suppose :)) –

Questions connexes