2016-10-03 1 views
0

Dans un test unitaire je résous une interface avec l'envoi d'arguments pour son constructeur comme ci-dessous:Château windsor - Impossible d'enregistrer un composant approprié avec argumants

var args = new { arg1 = "arg1 value", arg2 = "arg2 value" }; 
var component = container.Resolve<IMyDependency>(args); 

et il fonctionne très bien. Mais maintenant, je veux le faire dans l'injection de constructeur, par exemple dans:

public class Foo 
{ 
    private IMyDependency _dep; 
    public Foo(IMyDependency dep) { _dep = dep; } 
} 

Donc, comme essayer je l'enregistrer avec UsingFactoyMethod() comme ceci:

public class BarInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      Component.For<IMyDependency>().UsingFactoryMethod(
       () => 
       { 
        var args = new { arg1 = "arg1 value", arg2 = "arg2 value" }; 
        var result = container.Resolve<IMyDependency>(args); 
        return result; 
       }).LifestyleTransient()); 

     // + some other registerations and installs 
    } 
} 

Mais j'ai encore erreur:

Can't create component 'namespace.MyDependency' as it has dependencies to be satisfied.

'namespace.MyDependency' is waiting for the following dependencies:
- Parameter 'arg1' which was not provided. Did you forget to set the dependency?
- Parameter 'arg2' which was not provided. Did you forget to set the dependency?

Répondre

0

Enregistrez-vous IMyDependency ailleurs? Il est difficile de dire ce qui ne va pas jusqu'à ce que vous affichiez le code réel.

Cela devrait fonctionner:

container.Register(
     Component.For<IMyDependency>().UsingFactoryMethod(
      () => 
      { 
       return new MyDependency("arg1 value", "arg2 value"); 
      }).LifestyleTransient()); 
+0

Lorsque je vérifie, MyDependency est également enregistré dans d'autres enregistrements. –

1

Je pense que vous devriez essayer enregistrer IMyDependency implementaion avec son constructeur args au lieu d'utiliser "UsingFactoyMethod()":

string someArg = "something"; 
container.Register(
     Component.For<IMyDependency>().ImplementedBy<MyDependencyImp>() 
      .DependsOn(Dependency.OnValue("someArg",someArg)).LifestyleTransient()); 

En supposant constructeur MyDependencyImp ressemble à quelque chose comme ça :

public MyDependencyImp(string someArg) 
{ 
    /.... 
} 

Plus d'infos here.

+0

Je l'ai testé, et il me donne une erreur à propos de ce qu'il existe déjà un composant pour IMyDependency;). –

+0

Peut-être que vous l'avez aussi enregistré dans un autre endroit de votre code? Si oui, vous devriez essayer de le remplacer. – YuvShap

+0

Eh bien, comme je peux vérifier, il est seulement enregistré dans 'BarInstaller' et avec le code ci-dessus deux fois, Mais comment le remplacer? –