2010-10-25 16 views
0

J'essaie de comprendre comment effectuer les opérations suivantes:injection de dépendance dans une annotation de classe

[CustomAnnotation(thisVariableShouldBeInjected)] 
public class MyClass 
{ 
    // Normal class stuff 
} 

Maintenant, l'annotation de données est la décoration d'une classe de service WCF, qui a lui-même l'injection de constructeur en cours. Idéalement, je voudrais injecter l'annotation avec une valeur en utilisant le conteneur IOC de Ninject, mais cette question est indépendante du conteneur.

Je viens de refactoriser la classe Annotation d'une classe statique et je n'aimerais pas devoir la reconvertir.

Je suis heureux de faire l'injection de propriété (l'injection du constructeur ne fonctionnera pas avec les annotations de données car elles doivent être des expressions constantes afaik). Je ne sais pas comment dans ce cas.

Toutes les suggestions sont les bienvenues!


En réponse aux questions/commentaires:

Dans ce cas particulier, le service WCF est annotées avec des attributs, dont certains effectuent des fonctionnalités telles que les demandes de services d'audit et de collecte de statistiques. Dans ces cas, les classes d'annotation sont appelées directement par l'infrastructure WCF et je ne peux pas y accéder dans la phase du constructeur. J'essaie une injection de propriété basée sur la réflexion (comme suggéré). Dans cette situation, le fait que les classes d'annotations soient globales m'aide, puisque j'essaie d'injecter des instances de référentiel - je n'en ai jamais eu besoin de toute façon.

Cela peut être la façon dont je finis par faire l'injection. Cependant, il est beaucoup mieux dans mon livre que les classes statiques avec leurs références statiques au référentiel.

+0

Lorsque vous dites 'thisVariableShouldBeInjected', fournissez-vous une chaîne qui représente le nom d'une propriété ou d'un champ? – StriplingWarrior

+0

Peu importe, je vois ce que vous dites. Vous voulez que l'objet 'Attribute' réel ait une valeur définie par le cadre DI, n'est-ce pas? – StriplingWarrior

Répondre

1

Comme les attributs sont des méta-données de temps de compilation sur une classe, vous ne pouvez pas leur injecter de valeur au moment de l'exécution qui affecterait une instance particulière.

Vous pouvez utiliser la réflexion pour modifier une valeur (propriété) d'un attribut lors de l'exécution, mais ce serait global et non pour une instance particulière.