2009-01-13 13 views
1

Lorsque vous utilisez des attributs personnalisés pour stocker des métadonnées, est-il préférable de décorer l'interface ou la classe qui implémente l'interface, en supposant que toute classe qui implémente l'interface aura les mêmes données dans l'attribut?Les attributs personnalisés sur les interfaces ou les classes qui les implémentent?

Mise à jour: Fondamentalement, j'écris un mécanisme de stockage de données personnalisé pour un projet, et les objets représentent les différentes tables stockées. L'attribut personnalisé est utilisé pour désigner la table de l'ensemble de données utilisée pour stocker les objets de cette classe, ainsi que pour identifier les tables impliquées dans une relation n: m.

Donc, si je mets les attributs sur l'interface, est-ce une approche plus claire, ou est-ce qu'elle encombre l'interface et rend l'accès aux données plus encombrant?

Répondre

3

Cela dépend du scénario. WCF, par exemple, décore les interfaces pour les contrats d'exploitation. Cependant, si vous voulez parler des objets (plutôt que de l'interface elle-même), notez qu'il peut être pénible pour le code appelant d'obtenir des métadonnées d'interface, surtout si la classe utilise une implémentation d'interface explicite.

Il serait plus commune pour décorer la classe, mais qui est pas tout à fait la même question ;-P

Si l'attribut est vraiment spécifique à l'interface (pas les cas), puis bien - décorer l'interface et parler de typeof(IFoo) etc. Mais si vous pensez que le code sera capable de définir des valeurs par type pour les attributs, il devra être au niveau de la classe.

Quel est le scénario?

2

Cela dépend si l'interface a quelque chose à voir avec les métadonnées.

interface IRunnable 
{ 
    void Run(); 
} 

class Test : IRunnable 
{ 
    public void Run() { } 
} 

Dans cet exemple, il serait logique de placer les attributs sur l'interface s'ils se rapportent à l'intention de l'interface. Si les attributs sont applicables à toutes les implémentations, placez les attributs sur l'interface.

Toutefois, si les attributs n'ont rien à voir avec le "runnability" (avec "runnability" appartenant à IRunnable pas le CLR) de la classe puis mettre les attributs sur la classe.

Questions connexes