10

Lors de l'instanciation d'une classe, Windsor traite par défaut toutes les propriétés publiques de la classe en tant que dépendances facultatives et essaie de les satisfaire. Dans mon cas, cela crée une dépendance circulaire plutôt compliquée qui provoque le blocage de mon application.Windsor Container: Comment spécifier une propriété publique ne doit pas être rempli par le conteneur?

Comment puis-je explicitement dire à Castle Windsor qu'il ne devrait pas essayer de satisfaire une propriété publique? Je suppose qu'il doit y avoir un attribut dans cette mesure. Je ne peux pas le trouver cependant s'il vous plaît laissez-moi savoir l'espace de noms/assembly approprié.

S'il y a un moyen de le faire sans attributs (tels que la configuration Xml ou la configuration par code), cela serait préférable puisque la bibliothèque spécifique où cela se produit n'a pas besoin de dépendance à Castle.

+0

Ajout de cette question à la FAQ de Windsor: http://using.castleproject.org/display/IoC/FAQ –

Répondre

3

J'ai créé une installation pour aider à ceci:

+0

Ce lien est mort. Les mises à jour? –

+0

@GorgiRankovski Je ne suis pas sûr que ce paquet est pertinent pour les versions modernes de Castle.Windsor (j'utilise Structuremap ou Autofaq de nos jours donc je ne sais pas). Vous pouvez obtenir le code source [à partir de ce vieux svn sur google code] (https://code.google.com/p/gim-projects/source/browse/#svn%2Ftrunk) –

11

Vous pouvez utiliser l'attribut Castle.Core.DoNotWireAttribute pour arrêter une propriété d'être câblé par le conteneur IoC (ce qui est en l'assemblage Castle.Core, ce qui signifie que votre bibliothèque n'a besoin que d'une dépendance à l'assemblage léger Castle.Core - si par exemple vous souhaitez utiliser le c ode sans un conteneur d'inversion de contrôle, ou dans un conteneur IoC différent).

Je ne crois pas qu'il y ait un moyen d'empêcher le câblage de se produire dans la configuration Xml, mais il serait relativement facile d'ajouter le support pour cela - si je devais le faire je ne serais probablement:

  1. introduire une sorte d'attribut sur la déclaration de propriété dans le xml: < myprop fil = « false »/>
  2. Hériter de PropertiesDependenciesModelInspector, remplaçant les InspectProperties méthode pour appliquer une logique supplémentaire pour identifier les propriétés doit être ajouté en tant que dépendances au modèle de composants (inspection du modèle. Configuration de la paire attribut/valeur "false").
  3. Hériter de DefaultComponentModelBuilder et passer outre les InitializeContributors d'inclure votre remplacement PropertiesDependenciesModelInspector - ou tout simplement supprimer les propriétés existantes et contributeur ajouter votre propre au moment de l'exécution par le AddContributor/RemoveContributor méthodes.
  4. Remplacez l'instance de service ComponentModelBuilder affectée au noyau de votre conteneur.

Une autre approche qui pourrait fonctionner pour vous consiste à supprimer manuellement les dépendances du modèle avant que des instances du service ne soient demandées.

kernel.GetHandler (typeof (monComposant)). ComponentModel.Dependencies.RemoveAll (d => d.DependencyKey == "PropertyThatShouldNotBeWired");

YMMV avec cette approche cependant - surtout si vous avez des services démarrables ou d'autres installations qui peuvent instancier votre composant avec impatience après son enregistrement.

+0

Cet exemple de code ne fonctionne pas dans 2.5.x - la méthode 'RemoveAll()' a disparu. Y a-t-il une alternative? –

+0

P.S. J'utilise l'API d'inscription fluide. –

2

Je ne sais pas quelle version du château vous les gars utilisaient à ce moment-là, mais aucune des solutions mentionnées ne fonctionnait. De plus, il y a beaucoup de liens morts.

Avec le château 3.1, voici la solution que je suis venu avec (grâce à un code source du château creuser):

container.Register(Component.For(type) 
             .LifestyleTransient() 
             .Properties(propertyInfo => propertyInfo.PropertyType != typeof(MyOtherType))); 

La fonction 'Propriétés ajoute un filtre de propriété utilisé par le château lors de la construction du ComponentModel. Dans mon cas, toutes les dépendances de propriétés seront satisfaites sauf le type de propriété 'MyOtherType'.