2009-09-28 6 views
3

Existe-t-il de bonnes ressources qui expliquent les attributs et la réflexion, ainsi que leurs nombreuses utilisations en profondeur?Utilisation des ressources pour la réflexion et les attributs

Je m'intéresse particulièrement aux meilleures pratiques, c'est-à-dire lorsqu'il est utile ou approprié d'utiliser des attributs et des réflexions pour résoudre des problèmes informatiques spécifiques.

Répondre

3

Je ne connais pas une bonne ressource complète. Dans mon expérience, la meilleure façon d'apprendre est de se retrouver dans une situation qui ne peut être résolue sans elle (du moins pas facilement). Donc, si vous connaissez les situations de base où les attributs de réflexion facilitent les choses, vous saurez quand vous devez commencer à les apprendre.

Réflexion: approprié lorsque vous ne pouvez pas faire ce dont vous avez besoin sans lui.

Je sais que ça paraît un peu sarcastique, mais il est en fait vrai - si vous avez besoin d'écrire du code, mais il est juste aucun moyen de comprendre les types des objets que vous traitez, la réflexion est appropriée . Il est également approprié lorsque vous avez besoin de vous faufiler et d'utiliser des membres privés/protégés/internes d'un objet que vous ne contrôlez pas.

Attributs: approprié lorsque vous devez ajouter des informations supplémentaires sur un type.

Exemple: J'ai un tas de classes IConverter. Chacun correspond à un domaine spécifique de notre système de gestion de contenu. Comment puis-je décorer cette classe avec des informations supplémentaires qui décrivent le champ pour lequel elle est utilisée?

  • Je pourrais créer une interface différente pour chaque convertisseur, même si tous font la même chose, mais cela semble être une mauvaise idée.
  • Je pourrais mettre une propriété en lecture seule qui retourne une chaîne codée en dur au nom du champ sur chaque classe, mais alors je devrais créer une instance de chacun pour vérifier la valeur de la propriété.

Ce serait bien si je pouvais juste mettre une sorte d'information supplémentaire sur la classe elle-même qui dit à quel champ il est destiné. Ensuite, je peux vérifier tous mes types et trouver celui que je veux, et juste instancier celui-là. Attributs me laisser faire:

[HandlesField("FieldName")] 
public class FooFieldConverter : IConverter 
+0

Merci pour cela. –

1

Je ne pense pas qu'il existe des ressources générales qui pourraient vous fournir ce que vous recherchez. Dans l'ensemble, les attributs sont simplement un moyen d'ajouter des métadonnées au code, sans modifier le comportement de ce code. En eux-mêmes, les attributs ne font rien. Les attributs vous permettent de brancher votre code sur autre chose, et cette autre chose peut utiliser les métadonnées supplémentaires pour fournir des fonctionnalités améliorées.

Quelques bons exemples sont Visual Studio Design Surface et WCF. L'utilisation d'attributs tels que [Description], [Catégorie], etc. ne fait rien pour votre code ... mais laisse le concepteur Visual Studio afficher et organiser correctement vos objets. De même, les attributs [ServiceContract], [OperationContract], [DataContract], [DataMember] et d'autres attributs WCF ne font pas que votre code devienne un service Web ... ils permettent simplement de brancher votre code dans WCF, qui dans Turn en fait un service Web.

Les attributs sont un mécanisme d'injection de métadonnées, et rien de plus. D'autres programmes, cadres ou utilitaires qui utilisent ces métadonnées sont ce qui donne aux attributs leur véritable pouvoir. Il n'y a pas vraiment de «meilleures pratiques» sur le moment d'utiliser un attribut ou non. Ils sont juste un outil. Ils vous permettent d'annoter votre code avec des informations utiles et d'utiliser cette information ailleurs. La clé est de savoir quand vous avez besoin de métadonnées supplémentaires ... et c'est très subjectif ... seule la personne qui conçoit l'architecture du projet sera en mesure de déterminer si de nouveaux attributs personnalisés seront nécessaires.

Si vous avez un scénario spécifique où vous pensez avoir besoin d'attributs, mettez à jour votre réponse avec un exemple, et je verrai quelle aide supplémentaire je peux vous offrir.

+0

Voici un bon exemple: http://stackoverflow.com/questions/1482135/custom-authorizeattribute. L'OP de cette question crée un attribut personnalisé pour valider l'existence d'un enregistrement dans la base de données. J'ai répondu à sa question en déclarant qu'il serait peut-être préférable de vérifier dans le corps de la méthode, car l'attribut nécessite des connaissances spécialisées (l'identifiant de l'enregistrement) qu'il doit obtenir ailleurs, informations dont dispose déjà le corps de la méthode. –

+0

J'ai aimé l'idée d'un attribut personnalisé pour la sécurité basée sur les rôles, car c'est ainsi que fonctionne le système de sécurité dans ASP.NET MVC. J'ai pensé à créer des attributs personnalisés pour valider que l'utilisateur a accès à certains projets (c'est-à-dire projectID), mais l'utilisation d'un tel attribut nécessiterait que l'attribut ait une connaissance du projectID. Il peut obtenir ceci de la demande de HTTP, mais il semble désordonné; il introduit une autre dépendance pour obtenir le ProjectID, et le moteur de routage a DÉJÀ fourni la méthode de contrôle avec l'ID de projet requis –

+2

Vous devez garder à l'esprit ... la création et l'ajout d'un nouvel attribut NE RIEN en soi. Dans tous les contextes où un attribut "fait quelque chose", c'est le code d'infrastructure, tel que ASP.NET MVC, WCF, Visual Studio, un cadre de mappage OR, etc., qui récupère l'attribut et les métadonnées qu'il représente, et fait quelque chose avec il. Les attributs eux-mêmes sont inutiles sans un passe-partout supplémentaire pour les faire fonctionner. – jrista

Questions connexes