2010-12-09 118 views
2

如何讓Windsor尊重可選的注入構造函數參數?Windsor可選的構造函數參數

我試着製作一個IContributeComponentModelConstruction,它循環遍歷每個構造函數的每個ParameterInfo,並檢查它是否爲IsOptional,然後相應地在Windsor Dependency對象上設置IsOptional,但這似乎並沒有起到作用。我仍然得到「由於依賴......等原因而無法實例化」。

謝謝。

UPDATE:

我使用2.5.2.0爲Silverlight 4.0,可以與以下的重現:

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. 

回答

2

它在V2.5.2。

更新 我看了一下並運行你粘貼的代碼,你說得對,它不工作。溫莎確實認識到該參數有一個默認值。然而,溫莎也有第二條規則,null永遠不是一個有效的值的一個必要的依賴關係,這第二個規則贏得你的情況。

這應該可能被認爲是一個錯誤。

爲了使其工作,您需要用您自己的DefaultDependencyResolver替換。

你需要重寫的兩個方法:從DefaultDependencyResolver差不多是這樣的:

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; 
     } 
    } 
} 

,並使用此解析器而不是默認的。

+0

謝謝!它沒有自定義貢獻者,自動?或者我仍然需要自定義貢獻者? – Jeff 2010-12-10 03:43:52