2010-03-13 5 views
2

Je fais un usage intensif de la réflexion dans mon projet actuel pour simplifier grandement la communication entre mes contrôleurs et les services wcf. Ce que je veux faire maintenant est d'obtenir une valeur de la Session dans un objet qui n'a pas d'accès direct à HttpSessionStateBase (IE: Pas un contrôleur). Par exemple, un ViewModel. Je pourrais le transmettre ou y faire référence, mais ce n'est pas optimal dans ma situation.C# Réflexion StackTrace get value

Puisque tout vient d'un contrôleur à un moment donné dans mon scénario, je peux faire ce qui suit pour marcher le sac au contrôleur où provient l'appel, des choses assez simple:

 
var trace = new System.Diagnostics.StackTrace(); 

foreach (var frame in trace.GetFrames()) 
{ 
    var type = frame.GetMethod().DeclaringType; 
    var prop = type.GetProperty("Session"); 

    if(prop != null) 
    { 
    // not sure about this part... 
    var value = prop.GetValue(type, null); 
    break;  
    } 
}

Le problème est ici que je Je n'arrive pas à trouver comment obtenir "l'instance" du contrôleur ou de la propriété Session pour que je puisse en lire.

+1

Méfiez-vous de travailler comme ça: le compilateur JIT pourrait intégrer des fonctions/propriétés de sorte que vous ne les verriez pas correctement dans les versions de version. – Stormenet

Répondre

1

Pourquoi ne pas utiliser HttpContext.Current.Session? Vous ne voulez pas une référence à la partie Web? Sinon, je pense que vous aurez besoin d'une interface - une façade de session mise en place quelque part (ce qui est toujours utile) - un singleton est utile ou peut-être mis en place en utilisant un conteneur comme l'unité. Le httpContext est sensible au fil et il sert sesion plutôt bien. Vous pouvez faire une abstraction sur la session en fournissant la façade que j'ai déjà mentionnée pour la rendre plus agnostique, mais l'utilisation de l'infrastructure de débogage dans le code de production est ... discutable. :) Peut-être pouvez-vous utiliser la génération IL dans un certain sens ne veut pas le couplage?

+0

J'étais vraiment sur le point de penser. Merci, c'était exactement ce dont j'avais besoin. – John

3

Je ne pense pas que ce soit possible. StackTrace et StackFrame juste vous donner des informations de métadonnées sur qui a appelé votre méthode, pas l'instance réelle comme vous avez besoin.

4

Ceci n'est pas possible. La façon dont les arguments sont passés à une méthode est un détail d'implémentation, laissé au compilateur JIT. C'est très différent entre x86 et x64 par exemple. x86 passe les arguments sur la pile, x64 passe les 4 premiers arguments à travers les registres. Les valeurs à virgule flottante sont transmises soit sur la pile FPU, soit sur le registre SSE. Etc.

Le débogueur est conscient des détails en utilisant les informations de débogage générées par le compilateur JIT. Mais l'utilisation des interfaces de débogage dans un programme ne peut pas fonctionner, les programmes ne peuvent pas déboguer eux-mêmes.

+0

Très bonne info. Merci beaucoup! – John