9 votes

Passer une partie des paramètres du constructeur au conteneur Castle Windsor

J'ai le constructeur

Foo(IColor c , int someNumber)

et je connais le nombre uniquement pendant l'exécution, et je veux appeler ce constructeur pendant la résolution et passer la valeur someNumber et l' IColor à résoudre automatiquement.

Quelque chose comme cela:

container.Resolve<IFoo>(someNumber);

Est-il possible de le faire ?

18voto

Aleš Roubíček Points 2385

Vous devriez préférer une fabrique typée au lieu d'utiliser un conteneur comme un localisateur de service. Il suffit de définir une interface de fabrique :

public interface IFooFactory {
    IFoo Create(int somenumber);
}

et de l'enregistrer en tant que fabrique typée :

container.Register(Component.For().AsFactory());

Ensuite, utilisez l'injection de dépendance pour injecter la fabrique et l'utiliser :

var foo = fooFactory.Create(desiredArgumentValue);

Pour plus d'informations, consultez la documentation de Windsor

10voto

phoog Points 22667

Oui, passez les arguments du constructeur dans une instance d'un type anonyme ; les noms des propriétés doivent correspondre aux noms des paramètres du constructeur :

IColor couleurDesiree = //quelque chose
int nombreDesire = //autre chose
IFoo foo = container.Resolve(new { c = couleurDesiree, somenumber = valeurArgumentDesire });

Si vous utilisez une version plus ancienne de C# qui ne prend pas en charge les types anonymes (ou même si ce n'est pas le cas), vous pouvez faire la même chose avec un dictionnaire :

IColor couleurDesiree = //quelque chose
int nombreDesire = //quelque chose d'autre
Dictionary arguments = new Dictionary();
arguments.Add("c", couleurDesiree);
arguments.Add("somenumber", nombreDesire);
IFoo foo = container.Resolve(arguments);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X