IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Code et traçabilité.


Sujet :

Dotnet

  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut Code et traçabilité.
    Bonjour,

    Dans le cadre d'une application, dans certaines classes, je souhaite vérifier la présence d'attributs spécifiques sur l'appelant du code.

    Je m'explique... J'ai une classe A avec une méthode public alpha().
    Cette méthode peut etre appelée depuis plusieurs classes, B, C, D...
    chaque classe qui l'appelle est suceptible de porter des Attributs spécifiques.

    Ce qui m'intéresse c'est au niveau de A.alpha() récupéré au moment de l'exécution, quelle classe et a priori quelle méthode, a fait cet appel, pour pouvoir extraire les attributs custom de cette classe/méthode. (en gros je veux tracer l'appelant... pour vérifier qui a fait cet appel... ca me sert également à déterminer quelle confiance je peux accorder aux données fournie à A.alpha.. et le mettre en internal ne règlerais pas mon problème)

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut je pense
    Tu envoie une référence sur l'appelant dans ton appel et tu test si il est de tel ou tel type après tu fais ton traitement.

    ex dans B tu fais A.alpha(this, args);

    Je crois meme qu'il y a une fonction en dotnet pour récuperer dans quel bloc tu te trouve donc tu envoi aussi l'info de la fonction en question.

    a voir dans le System.Runtime

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    oui ce serait une solution, mais c'est pas tellement le but

    car je peux pas forcément avoir confiance dans le développeur qui peut choisir de mettre une référence d'une instance systeme qui elle a un niveau d'approbation maximale.

    quand on développe une api, framework, on ne doit pas partir du principe qu'on peut faire confiance au developpeur final, car s'il y a une connerie à faire, tu peux etre sure qu'il la fera...
    je le sais, j'ai été dans le cas, une développeur a utiliser le framework et la première chose qu'il a faite, c'est justement ce qu'il ne devait pas faire...

    je dois vraiment traquer l'appelant automatiquement sans avoir à faire appel à la responsabilité du développeur

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Bon alors au fil de mes recherches dans la doc du framework, j'ai fini par trouver un début de solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public string Environment.StackTrace { get; }
    Permet de récupèrer la trace de la pile d'exécution.
    une fois la quatrième ligne récupérée et correctement parsée, il y a moyen de récupèrer le nom (namespace compris) du type responsable de l'appel.
    A partir de là grâce au mécanisme de reflexion on peut facilement obtenir le type de l'objet dont on à le nom complet, et de là extraire les informations que l'on souhaite dessus (les attributs prédéfinis et custom)

    Si toutefois quelqu'un voie une solution plus simple et plus efficace, je reste ouvert, toute proposition, surtout d'une solution ne mettant pas en cause du parsing de chaine qui peut d'une langue à l'autre changer complètement.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Si ca intéresse quelqu'un j'ai encore trouvé beaucoup mieux

    et oui, en cherchant pas mal,

    Dans "System.Diagnostics" on trouve une classe StackTrace collection de StackFrame, et cette classe StackTrace permet d'obtenir l'état de la pile d'appel au moment où on lui demande.

    Ainsi, le premier élément que l'on sort de la pile d'appel c'est le code où stackstrace est instancié, au niveau juste en dessous, la méthode appelante, de là on peut extraire le type d'où sort la méthode et donc en extraire les attributs

    Voila fini par trouver une solution qui permet de ne pas faire une confiance aveugle dans la responsabilité des developpeurs générallements irresponsables...

    Merci à tous.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Jouer avec StackTrace est très lent cela dit.
    Tu peux aussi jeter un oeil du côté des attributs de sécurité dans System.Security.Permissions. C'est fait pour ce genre de choses à la base.


    Après, Murphy oblige, tu peux blinder autant que tu veux mais tu tomberas toujours sur un boulet qui te cassera tout :)

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut oui le boulet
    oui le boulet est partout et tant que l'on aura pas inventé un pc qui fait exactement ça : on ne sera pas a l'abri

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    oui c'est vrai aussi... enfin cela dit j'ai d'autres intentions, aussi.

    pour la sécurité les permissions c pas mal mais ya d'autres choses également.

    Je manipule des tonnes d'attributs avec des tas de métadonnées à l'intérieur
    Ca me permet de controler ce que je dois activer comme mécanisme ou pas, (si ta pas mis que t'utilise un service du noyau... il est pas chargé, et zou .... un gros message d'erreur te rappel que tu es un gros boulet qui ferait mieux de changer de métier)

    Car mine de rien, la reflection non plus n'est pas des plus rapides. Charger dynamiquement et instancier un type à la volée (surtout dans une assembly chargée àla volée) c'est lent.
    Bon c sur ya la mise en cache mais a règle pas tout.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Question bête : avec tout le temps que tu a l'air de passer pour contrôler que personne ne fait n'importe quoi, est-ce qu'il reste encore du temps pour faire ce dont le client a besoin ?

    Parce que bon, mis à part le fait que peu importe la quantité de contrôle dans le code, quelqu'un passera toujours (toujours) au travers des mailles du filet, il y a déjà un truc qui existe pour s'assurer que le code fait bien ce qu'il faut : les tests unitaires. Ça ne demande quasiment aucun temps de mise en place, ça n'alourdit pas le code et ça fait gagner du temps au final plutôt que l'inverse.
    Et il y a déjà les outils qu'il faut pour vérifier que le code fait par d'autres est correctement couvert par les tests.
    Et il y a aussi le test-driven development pour s'assurer que l'intégralité du code écrit correspond aux besoins et est automatiquement validé par les tests. C'est plus difficile à maîtriser par contre.

    Enfin bref. Quitte à passer un temps monstre à empêcher les dévs de faire n'importe quoi, autant le passer à les 'obliger' à faire des tests unitaires sur leur code plutôt que d'attendre qu'ils mettent n'importe quoi et de faire planter à l'exécution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 03h17
  2. code pour interbase 6.0 et 6.5 de generateur
    Par tripper.dim dans le forum InterBase
    Réponses: 4
    Dernier message: 01/07/2002, 12h29
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 15h58
  4. Explorateur de code C
    Par Zero dans le forum C
    Réponses: 14
    Dernier message: 06/06/2002, 10h41
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 18h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo