2010-12-09 5 views
2

Comment Windsor peut-il respecter les paramètres de constructeur optionnels pour l'injection?Windsor Paramètres du constructeur en option

J'ai essayé de créer un IContributeComponentModelConstruction qui boucle chaque ParameterInfo de chaque constructeur et vérifie s'il est IsOptional, puis définit IsOptional sur l'objet Windsor Dependency en conséquence, mais cela ne semble pas faire l'affaire. Je reçois toujours un message "Impossible d'instancier en raison de la dépendance ... etc.".

Merci.

MISE À JOUR:

J'utilise 2.5.2.0 pour Silverlight 4.0 et peut reproduire ce qui suit:

var container = new WindsorContainer(); 
    container.Register(Component.For<TestClass>()); 
    container.Resolve<TestClass>(); //boom 

    public class TestClass 
    { 
     public TestClass(ITest test=null) 
     { 

     } 
    } 

    public interface ITest 
    { 

    } 


Missing dependency. 
Component TestClass has a dependency on ITest, which could not be resolved. 
Make sure the dependency is correctly registered in the container as a service, or provided as inline argument. 

Répondre

2

Il fait en v2.5.2. J'ai regardé et j'ai exécuté le code que vous avez collé et vous avez raison, cela ne fonctionne pas. Windsor reconnaît correctement que le paramètre a une valeur par défaut. Cependant, Windsor a également une deuxième règle, que null n'est jamais une valeur valide pour une dépendance requise, et cette deuxième règle gagne dans votre cas.

Cela devrait probablement être considéré comme un bug.

Pour que cela fonctionne, vous devrez remplacer le DefaultDependencyResolver par le vôtre.

Vous aurez besoin de passer outre deux méthodes: à partir DefaultDependencyResolver à peu près comme ceci:

public class AllowDefaultNullResolver : DefaultDependencyResolver 
{ 
    protected override bool CanResolveServiceDependency(CreationContext context, ComponentModel model, DependencyModel dependency) 
    { 
     return base.CanResolveServiceDependency(context, model, dependency) || dependency.HasDefaultValue; 
    } 

    protected override object ResolveServiceDependency(CreationContext context, ComponentModel model, DependencyModel dependency) 
    { 
     try 
     { 
      return base.ResolveServiceDependency(context, model, dependency); 
     } 
     catch (DependencyResolverException) 
     { 
      if(dependency.HasDefaultValue) 
      { 
       return dependency.DefaultValue; 
      } 
      throw; 
     } 
    } 
} 

et utiliser ce résolveur au lieu du défaut.

+0

Merci! Il le fait sans un contributeur personnalisé, automatiquement? Ou ai-je encore besoin du contributeur personnalisé? – Jeff

+0

OOTB, rien n'est nécessaire. –

+0

Bien! Merci!!! – Jeff

Questions connexes