如何让Windsor尊重注射的可选构造函数参数?
我尝试制作一个IContributeComponentModelConstruction,循环遍历每个构造函数的每个ParameterInfo,并检查它是否为IsOptional,然后相应地在Windsor Dependency对象上设置IsOptional,但这似乎不起作用。我仍然得到“因为依赖而无法实例化等等。”
感谢。
更新:
我正在使用2.5.2.0 for 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.
答案 0 :(得分:2)
在v2.5.2中。
<强>更新强>
我看了一眼,然后运行了你粘贴的代码,你是对的,它不起作用。 Windsor确实正确识别该参数具有默认值。然而,Windsor还有第二条规则,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;
}
}
}
并使用此解析程序而不是默认解析程序。